如何在不提示下载的情况下在浏览器中显示以字节形式返回的图像?

时间:2010-12-08 03:37:38

标签: php http http-headers

我编写了以下PHP函数,但仍然提示下载该文件:

function navigateToBytes($contentType, $bytes){
  header('Content-Type: ' .$contentType); 
  //header('Content-Transfer-Encoding: binary'); // UPDATE: as pointed out this is not needed, though it does not solve the problem
  header('Content-Length: '.strlen($bytes));
  ob_clean();
  flush();
  echo $bytes;
}

调用函数的一个例子:

navigateToBytes('image/jpeg', $bytes); // UPDATE: turns out this does work, using image/tiff for tiff images is when the browser does not display the image

其中$ bytes是从文件中读取的字节。

4 个答案:

答案 0 :(得分:1)

道歉所有 - 事实证明我遇到了问题,因为我测试的图像是TIFF(内容类型正确设置为图像/ tiff),当我使用JPEG时,浏览器会显示图像!

最终,由浏览器决定是否可以显示您要发送的内容类型。

对于记录,我需要更改的唯一标题是

Content-Type, 

我应该设置

Content-Length 

除非我设置

Transfer-Encoding: chunked

答案 1 :(得分:0)

尝试使用HTTP标头" Content-Disposition: Inline"但是有些浏览器可能会尝试保护用户不会看到二进制数据。这是一篇关于该HTTP标题的随机博客文章:

http://dotanything.wordpress.com/2008/05/30/content-disposition-attachment-vs-inline/

答案 2 :(得分:0)

这对我来说似乎是正确的行为。浏览器是人类查看内​​容的视口。人类大体上不想查看二进制数据。您认为应该怎么做?

随机建议:如果某个网站正在执行您想要执行的操作,请使用curl来嗅探他们发送的标头。

curl -I http://example.com/path/to/binary/file/that/displays/in/browser

然后在您自己的脚本中使用完全相同的标题。

答案 3 :(得分:0)

首先,摆脱HTTP(Content-Transfer-Encoding)中不存在的东西。

然后获取HTTP跟踪工具,例如Firefox的Live HTTP标头插件,并比较"您的"带有工作图像的标题。

有疑问,请在此处发布HTTP跟踪。