我正在寻找一种方法来强制浏览器下载图像,而不是只显示它。
我已经看了很多(并且深刻地)并且似乎没有标准的方法来做到这一点。
Facebook的方式,它与一些PHP我猜他们在最后放了一个参数: 的?DL = 1
所以它肯定是一个PHP页面背后的网址重写我猜
<a class="itemAnchor" role="menuitem" tabindex="-1" href="http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/327910_2733459209258_1040639162_2895571_6924037615_o.jpg?dl=1" rel="ignore"><span class="itemLabel fsm">Download</span></a>
所以,如果你有任何线索他们是如何做到的...我的线索是他们可能在PHP页面的标题中做了一些事情
答案 0 :(得分:6)
他们只是使用HTTP标头强制下载,就像使用任何其他文件一样:
<?php
$file = 'C:\\test.jpg';
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Type: '.mime_content_type($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file));
readfile($file);
?>
<强> X-SENDFILE 强>
对于较大的文件或繁忙的网络服务器,我建议使用X-SendFile标头而不是使用readfile()
功能(请注意,您需要在Apache中安装mod_xsendfile
。)
header('X-Sendfile: '.$file);
//readfile($file);
<强> .htccess 强>
正如您所注意到的,Facebook URL指向的是jpg文件,而不是PHP文件。
您需要在.htaccess
文件中进行URL重写才能执行此操作。
以下内容应该有效(注意您需要使用真实的URL,检查$_SERVER
的内容才能这样做)。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
答案 1 :(得分:2)
您必须在Content-Disposition
中定义header变量:
<?php
header("Content-Disposition: attachment; filename='downloaded.png'");
?>
答案 2 :(得分:1)
您可以通过在发送文件之前设置适当的标头来实现此目的。具体来说,您可以将Content-Type
设置为您的内容类型和Content-Disposition: attachment; filename=<yourfilename>
。
IE有一些问题;查看this answer了解详情。