2012-03-28 112 views
1

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

我已经看了很多(和深入),似乎有没有标准的方式来做到这一点正确。

的方式Facebook的做到这一点,它与一些PHP我猜他们把参数结尾:? (DL)= 1

所以它肯定是一个PHP页面的URL rewritting后面我猜

<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页面

+1

你可能想给这篇文章阅读:http://www.ryboe.com/tutorials/php-headers-force-download 似乎正是你所追求的,只要你真的自己提供图片。 – MichD 2012-03-28 22:35:06

+0

谢谢,我会! ;) – 2012-03-28 22:42:28

回答

6

他们只是力downloadi的头NG使用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

对于大文件或繁忙的Web服务器,我会建议使用X-SendFile头代替使用readfile()函数(注意,您需要在Apache中安装mod_xsendfile)。

header('X-Sendfile: '.$file); 
    //readfile($file); 

.htccess

正如你注意到,在一个jpg文件的Facebook网址点,而不是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

你在标题中放什么呢? – 2012-03-28 22:35:44

+0

我应该使用这个:http://tools.ietf.org/html/rfc2616#section-19.5.1作为附件? – 2012-03-28 22:38:34

+0

ahaha你竞争有我的“接受答案”你是最快的,我会接受你的我必须等5分钟;) 你的答案是完美的,再次感谢:) – 2012-03-28 22:44:24

2

你必须在你的header定义Content-Disposition变量:

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

您可以通过发送文件之前设置相应的头文件实现这一点。具体而言,您可以将Content-Type设置为您的内容类型为Content-Disposition: attachment; filename=<yourfilename>

IE有一些问题;查询this answer了解更多信息。

+0

好的,谢谢我明白了,我真的看着它的一个很长时间太棒了! ;) – 2012-03-28 22:41:33