当用户点击指向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上提供的示例。
答案 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:
显然,您需要确保在设置标头之前没有其他输出。输出缓冲是确保不向浏览器打印任何内容的好方法。