代码之家  ›  专栏  ›  技术社区  ›  Derek

关闭从网站打开Internet Explorer中XLS文件的选项?

  •  1
  • Derek  · 技术社区  · 14 年前

    背景:

    我为一个客户机构建了一个Web应用程序,允许他们将Excel文件保存到服务器上。

    当我第一次构建应用程序时,我将这些文件存储在一个上传文件夹中,并直接从应用程序中的页面(如文件)链接到它们。

    经过思考,这不是很安全,所以我更改了上载程序文件,将文件存储在web根目录之上,从而阻止直接访问。

    我通过一个php“retriever”文件(如文件)将文件传递回用户。文件(经过一些用户身份验证检查)如下所示:

    header("Content-type: application/octet-stream");
    $_file = $_GET['filename'];
    $sPattern = '/\s*/m';
    $sReplace = '';
    
    $_strippedfile = preg_replace( $sPattern, $sReplace, $_file );
    header("Content-Disposition: attachment; filename=".$_strippedfile."");
    echo file_get_contents('/var/www/uploads/'.$_file);
    

    问题:

    除非用户选择在Internet Explorer中“打开”而不是“保存”,否则上述所有操作都可以正常工作。找不到Excel试图打开文件并引发“…”。检查文件名的拼写,并验证文件位置是否正确。

    我在谷歌上搜索了这个错误,它似乎与文件名的长度(包括路径)有关。不幸的是,到Internet临时文件的路径超出了我的控制,所以想知道是否有一种方法强制用户保存文件而不是打开它?[很明显,这可以在本地配置,但a)我的客户机不是很专业,b)因为他们在公司网络上,所有的管理权限都受到限制。]

    欢迎有其他想法。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Community basarat    7 年前

    通过发送头文件,可以防止打开IE8中的文件。

    X-Download-Options: noopen

    在早期版本中,您需要向包含XLS文件的页面添加DownloadOptions元标记。

    但似乎您遇到的问题与文件名的长度无关,与响应上的缓存头无关。您需要确保您的文件标记为可缓存(例如,cache control:private),尤其是在使用https时。参见 Download file over HTTPS in IE 5.5 / IIS 5.0 供进一步讨论。

        2
  •  1
  •   Pekka    14 年前

    我不这么认为。在关联应用程序中打开文件是浏览器提供的基本功能,不受影响。

    这很遗憾,因为这里还有一个额外的用户体验问题。我从互联网上打开一个文件,Excel允许我编辑它。因此,当我保存它时,我可以安全地假设更改返回到Internet。正确的?或者至少,他们没有迷路。正确的?正确的?试着向一个非技术性的用户解释,他已经在一个文档上工作了两个小时,以至于他们的工作丢失了。

    但我离题了。您可能还想继续使用下载头文件。我很难想象Excel文件下载后不能直接打开。

    你能试着发送一个 Content-type: application/ms-excel ?还是会自动打开,不提供保存?

    另外,您的文件名是否包含任何特殊字符/umlauts?斜线?Gipsy King提到的空间?所有这些都会导致打开时出现问题。