2011-12-21 34 views
2

我目前正在显示图像,并通过一个PHP文件输出图像隐藏src代码。但是,当我右键单击显示的图像并下降到“另存为”时,它会提示我下载php文件而不是实际图像(显然是因为它指向该src)。'另存为'图像从src从PHP

我能做什么来下载实际的图像,而不是displayImage.php?

+0

链接的图像,而不是一个PHP文件? – KingCrunch 2011-12-21 14:08:06

+2

你可以使用'Content-Disposition'。 – Polynomial 2011-12-21 14:08:33

+0

哪个浏览器?在Firefox 8中执行此操作时,当URL为“images.php?src = public/icons/22/warning.png”时,最终下载名为“images.php.png”的文件(这是一个有效的png文件)实际的源代码在src param中,所有正确的mimetype头文件都在PHP文件中设置)。 +1我从来没有见过这个,没有意识到这一点。 – 2011-12-21 14:11:21

回答

5

它不会提示你下载的PHP文件,它只是使用的是作为文件名,因为这是从它获得的图像数据的文件名。如果您手动输入有效的图像文件名并尝试打开保存的内容,它应该仍然是有效的图像。

您也可以通过将文件名包含在来自PHP文件的Content-Disposition:标头中来给出一个合理的名称,例如,

$filename = 'image.jpg'; 
header('Content-Disposition: inline; filename="'.$filename.'"'); 
// Don't forget the Content-Type as well... 
// Output image here 

......然而,这依赖于浏览器处理这种理智,这不是所有的人做:-(

+0

我建议包括一个内容类型的头文件。和一个内容长度的标题(不是绝对必要的,但浏览器不能显示没有它的下载进度) – GordonM 2011-12-21 14:16:59

+1

@GordonM刚刚意识到这一点应该与你的评论同时进行并编辑答案:-) - 虽然'下载进度“是无关紧要的,因为您正在执行'右键点击 - >另存为...',因此图像已经被下载,您实际上只是将其从浏览器temp/cache目录本地移动到您保存的位置。 – DaveRandom 2011-12-21 14:18:58

+0

谢谢,yup已经有内容类型,但添加了C​​ontent-Disposition标题,似乎工作 – Jason 2011-12-21 16:19:28

3

您可以在标题中发送文件名。

header("Content-Type: image/png"); 
header('Content-Disposition: inline; filename="some.png"'); 
+1

'attachment'有强制下载盒的风险,你应该使用'inline'代替 - 尽管一般概念是合理的 - +1 – DaveRandom 2011-12-21 14:12:54

1
  1. 发送图像生成器脚本正确的内容类型:

    header('Content-type:image/jpg');

  2. 如果您希望在PHP脚本输出图像时使用.jpg扩展名,则需要执行htaccess或httpd.conf rewri te,你可以在其中重写一个.jpg请求到你的php图像生成器脚本。

见的mod_rewrite http://httpd.apache.org/docs/current/mod/mod_rewrite.html