强制保存所有浏览器的文件 - 不在浏览器窗口中打开

时间:2012-04-03 16:07:51

标签: php download

我正在寻找一个适用于所有浏览器的简单解决方案。

对于特定的文件类型或通过类的目标链接:如何让它们在所有主流浏览器中强制下载。

我以为我找到了apachce服务器的完美解决方案 - 将其添加到.htaccess中。

http://css-tricks.com/snippets/htaccess/force-files-to-download-not-open-in-browser/

AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf

似乎可以在Firefox和Safari中使用,但不能使用chrome或IE(尚未测试任何其他内容)

任何人都可以帮我解决一下如何制作链接以强制下载文件的解决方案,而不是在浏览器中打开所有浏览器。

我似乎找不到完整的浏览器校对解决方案。这不可能吗?

指向教程或片段的任何链接都很棒。

我的网站如果基于PHP,那么如果可以的话,可以使用PHP。

由于

3 个答案:

答案 0 :(得分:5)

将Content-Disposition标头设置为“attachment”,就像这样(在PHP中):

header('Content-Disposition: attachment');

您甚至可以为下载提出一个文件名(如果它与URL中给出的文件名不同):

header('Content-Disposition: attachment; filename=file.ext');

如果您想直接在Apache服务器上执行此操作,请尝试以下操作:

<FilesMatch "\.(pdf|csv|xls)">
  Header set Content-Disposition attachment
</FilesMatch>

(您可以在FilesMatch模式中添加更多扩展名)

如果可以的话,尽量避免使用application / octet-stream标头,也就是说,如果Content-Disposition在没有它的情况下工作。这是因为有些系统实际上会关注Content-Type并将其与文件一起保存。如果用户的系统可以找出文件的正确MIME类型,通常会更好。

答案 1 :(得分:0)

假设$file保存了文件的路径,这是我经常用来执行此操作的脚本:

$file = 'file.gif'; // example
$filesize=filesize($file);

if ($filesize > 0) {
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: image/gif");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=\"".basename($file)."\";" );

readfile($file);
}

您确实面临没有文件结构的设备(例如iPad / iPhone)的问题,但您可以删除Content-Disposition行以解决此问题。

答案 2 :(得分:0)

<FilesMatch "\.(?i:pdf)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

将此添加到.htaccess(将pdf更改为您想要的任何一个) - 这在我测试的所有浏览器中都有效(未测试过歌剧或野生动物园)