2012-04-03 56 views
4

我正在使用简单的解决方案在所有浏览器中工作。强制保存所有浏览器的文件 - 无法在浏览器窗口中打开

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

我以为我找到了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的工作,如果posible。

感谢

回答

5

设置Content-Disposition首部以“附件”,像这样(在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图案更扩展)

尽量避免使用应用程序/八位字节流标头如果可以,即,如果内容处理工作没有它。这是因为一些系统实际上关注了Content-Type并将其与文件一起保存。如果用户的系统能够找出文件的正确MIME类型,那么对用户来说通常会更好。

+0

您好,感谢您的帮助。我将这添加到我的WordPress的网站。在我的单一download.php模板(这是我想要强制下载的地方),我把你的线添加到模板中,像这样... '<?php /** * @package WordPress * @subpackage MyTheme */ get_header(); header('Content-Disposition:attachment'); ?>' 但似乎没有效果?谢谢 – Joshc 2012-04-04 11:02:38

+0

确保在输出任何东西到浏览器之前运行所有header()调用。如果get_header()函数输出任何内容,则在此之前放置header()调用。 – 2012-04-07 14:50:12

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行来解决这个问题。

+0

谢谢,你的回答看起来很有趣。我认为我可以在wordpress的基本循环中简单地工作,但我的PHP知识是非常基础的。我试图通过厨房短代码来实现这个功能......'do_shortcode('[gallery customgal =“true”]');'这是由这个自定义图库函数生成的... https://gist.github .com/2300437 - 我想强制下载的** $ fullsize_image **变量,用于**第108行**。任何指针将非常感谢谢谢。玩笑 – Joshc 2012-04-04 11:24:44

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

添加此为.htaccess(PDF改变对无论你想) - 这是目前我已经测试了所有的浏览器工作(没有测试过歌剧或Safari)