当调用fpassthru时,标题中的Content-Type被更改

时间:2012-12-20 14:19:48

标签: php header amazon-web-services

当用户点击指向Amazon AWS提供的图片的链接时,我试图强制浏览器显示下载对话框。我有以下PHP脚本来完成这项工作。然而,在iPad上生成乱码文本的网页却失败了。尽管将标题中的Content-Type设置为“image / jpeg”,但结果文件显示为CSV,这可能会导致iPad上的问题(而桌面浏览器正在纠正为正确的类型)。

如果我在内容类型die()显示为JPEG之前放置了fpassthru($fp)

如何确保我的内容类型正确设置并以JPEG格式发送?

$urlComponents = parse_url($url); // where URL is the URL to the image on AWS
if (!isset($urlComponents['path'])) {
    die();
}
$pathParts = pathinfo($urlComponents['path']);
if (!isset($pathParts['basename'])) {
    die();
} else {
    $image = $pathParts['basename'];
}

$fp = fopen($url, 'rb');

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$image");
header("Content-Type: image/jpeg");
header("Content-Transfer-Encoding: binary");

fpassthru($fp);

fclose($fp);

代码基于PHP.net网站http://php.net/manual/en/function.fpassthru.php上提供的示例。

2 个答案:

答案 0 :(得分:2)

fpassthru没有设置标题所以问题出现在之前或之后(控制后代码)

答案 1 :(得分:0)

我应该提一下,在标题名称和分号之前有一个空格,它的值和没有标题一样好。并默认为text / html,例如

header('Content-type : image/jpeg'); //will not work. will default to text/html
header('Content-type: image/jpeg'); //will work

也是Content-type而不是Content-Type!字段名称区分大小写

  

4.2邮件标题

     

HTTP标头字段,包括通用标头(第4.5节),   request-header(第5.3节),response-header(第6.2节)和   entity-header(第7.1节)字段,遵循相同的通用格式   RFC 822 [9]的3.1节中给出的。每个标题字段包含   名称后跟冒号(“:”)和字段值。 字段名称   不区分大小写。

Hypertext Transfer Protocol -- HTTP/1.1

显然,您需要确保在设置标头之前没有其他输出。输出缓冲是确保不向浏览器打印任何内容的好方法。