1

当用户单击指向由 Amazon AWS 提供的图像的链接时,我试图强制浏览器显示下载对话框。我有以下 PHP 脚本来执行此操作,这主要是有效的。但是,它在生成乱码网页的 iPad 上却失败了。尽管将标头中的 Content-Type 设置为“image/jpeg”,但生成的文件显示为 CSV,这可能是导致 iPad 上出现问题的原因(而桌面浏览器正在更正正确的类型)。

如果我在 Content-Type 显示为 JPEGdie()之前放置了一个。fpassthru($fp)

如何确保我的 Content-Type 正确设置并以 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上给出的示例。

4

2 回答 2

2

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

于 2012-12-20T15:03:31.677 回答
0

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

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

它也是内容类型而不是内容类型!字段名称区分大小写

4.2 消息头

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

超文本传输​​协议——HTTP/1.1

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

于 2013-03-03T11:51:07.957 回答