Php 是否关闭从站点在internet explorer中打开xls文件的选项?

Php 是否关闭从站点在internet explorer中打开xls文件的选项?,php,security,excel,internet-explorer,Php,Security,Excel,Internet Explorer,背景: 我为客户机构建了一个web应用程序,允许他们将excel文件保存到服务器 当我第一次构建应用程序时,我将这些文件存储在uploads文件夹中,并直接从应用程序中的页面(例如文件)链接到它们 经过反思,这不是很安全,所以我更改了上传文件,将文件存储在web根目录之上,从而防止直接访问 我通过php“retriever”文件(例如文件)将文件返回给用户。文件(经过一些用户身份验证检查后)如下所示: header("Content-type: application/octet-stream"

背景:

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

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

经过反思,这不是很安全,所以我更改了上传文件,将文件存储在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)因为他们在公司网络上,所以所有管理权限都受到限制。]


欢迎任何其他想法。

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

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

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

能否尝试发送
内容类型:应用程序/ms excel
?还是会自动打开,而不提供保存


此外,您的文件名是否包含任何特殊字符/Umlauts?砍?吉卜赛国王提到的空间?所有这些都可能导致在打开时出现问题。

您可以通过发送头来防止在IE8中打开文件

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


但您遇到的问题似乎与文件名的长度无关,而与响应上的缓存头有关。您需要确保您的文件标记为可缓存(例如缓存控制:private),尤其是在使用HTTPS时。请参阅以获取进一步讨论。

我记得在文件名和IE中存在空格问题,并用_下划线替换空格。感谢您的快速回复。关于特殊角色,你似乎是对的,但internet explorer似乎把它们放在了自己身上!?它似乎正在用附加的方括号保存文件,例如在internet临时文件中保存.myfile[1].xls,即使我已清除internet临时文件文件夹。我已经用firefox进行了测试,并将其另存为myfile.xls。奇怪的有什么想法吗?关于特殊角色你似乎是对的,但internet explorer似乎把它们放在了自己身上!?它似乎正在用附加的方括号保存文件,例如在internet临时文件中保存.myfile[1].xls,即使我已清除internet临时文件文件夹。我已经用firefox进行了测试,并将其另存为myfile.xls。奇怪的有什么想法吗?谢谢你的快速回复!括号来自文件夹中已经存在的同名文件,taht应该可以。如果没有其他特殊字符
äöü/$%
等,这真奇怪为什么不起作用…排序!关于缓存控制设置,您是对的。从教程中获得以下内容://启用缓存//秒、分钟、小时、天$expires=60*60*24*14;标题(“Pragma:public”);标题(“缓存控制:maxage=”.$expires);标头('Expires:'.gmdate('D,dmy H:i:s',time()+$Expires)。'GMT');现在,文件可以毫无问题地打开了。谢谢