【问题标题】:PHP force browser downloading image, Facebook likePHP强制浏览器下载图片,Facebook赞
【发布时间】:2012-03-28 22:30:57
【问题描述】:

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

我已经看了很多(而且很深入),似乎没有标准的方法可以正确地做到这一点

Facebook 这样做的方式是使用一些 PHP,我猜他们在末尾添加了一个参数: ?dl=1

所以它肯定是一个 PHP 页面,我猜想是一个 url 重写

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

【问题讨论】:

标签: php


【解决方案1】:

他们只是强制下载,就像你使用任何其他文件一样:

<?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>

【讨论】:

  • 那你在标题中放了什么?
  • 我应该使用这个:tools.ietf.org/html/rfc2616#section-19.5.1 作为附件?
  • ahaha 你竞争让我的“接受答案”你是最快的我会接受你的我必须再等 5 分钟;)你的答案是完美的再次感谢 :)
  • 非常详尽/详细的答案。 +1
  • 熟能生巧;)。乐于助人!
【解决方案2】:

您必须在 header 中定义 Content-Disposition 变量:

<?php
   header("Content-Disposition: attachment; filename='downloaded.png'");
?>

【讨论】:

    【解决方案3】:

    您可以通过在发送文件之前设置适当的标头来实现此目的。具体来说,您可以将Content-Type 设置为您的内容类型和Content-Disposition: attachment; filename=&lt;yourfilename&gt;

    IE 存在一些问题;查看this answer了解更多信息。

    【讨论】:

    • 好的,谢谢我知道了,我真的看了很久,太棒了! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2011-09-25
    • 2020-07-08
    相关资源
    最近更新 更多