PHP强制浏览器下载图片,Facebook就像

时间:2012-03-28 22:30:58

标签: php

我正在寻找一种方法来强制浏览器下载图像,而不是只显示它。

我已经看了很多(并且深刻地)并且似乎没有标准的方法来做到这一点

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页面的标题中做了一些事情

3 个答案:

答案 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了解详情。