我们最近在我们的网站上实施了Amazon S3,这使我们改变了处理图像的方式。我们曾经调用一个控制器/fotos.php,它将从磁盘读取文件,记录一些统计信息,设置标题并将文件内容作为image / jpeg返回。
一切顺利,直到S3。 Fotos.php现在执行302重定向到亚马逊的资源,一切都很好,但是你无法在Firefox中保存图像,因为它将文件类型设置为.htm。我在这个问题上找到了这个讨论,这似乎是Firefox中的一个错误:
https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/207670
这是一个展示问题的网址(尝试保存大图片):
http://www.viajeros.com/fotos/el-gran-lago-de-atitlan-y-sus-volcanes/132968
Internet Explorer 6至少尝试将其另存为Untitled.BMP。
以下是我们在fotos.php中使用的代码片段:
$archivo = $fotos->ObtenerPathFotoAmazon( $url, null ); if (empty($_GET['nocache'])) { header('HTTP/1.0 302 Found'); header("Expires: ".gmdate("D, d M Y H:i:s", time()+315360000)." GMT"); header("Cache-Control: max-age=315360000"); } else { header('HTTP/1.0 307 Temporary Redirect'); } header('Location: ' . AWS_BUCKET_URL . $archivo); die;
您知道解决方法吗?
编辑:我们也在使用CloudFront。
答案 0 :(得分:5)
这不是错误
S3本身不知道你存储的对象是什么mimetype。当您在S3中 PUT 对象时,您还需要包含 Content-Type 和 Content-Disposition 标头(以及您可能想要的任何其他内容)。执行此操作时,当您或其他任何人获取的对象时,S3将使用这些标题值进行回复
答案 1 :(得分:4)
尝试使用指定图像的内容类型
header('Content-Type: image/jpeg');
或
header('Content-Type: image/png');
也许您必须使用内容处理附件让PHP指定内容类型(位置将任务留给Web服务器)
$archivo = $fotos->ObtenerPathFotoAmazon( $url, null );
if (empty($_GET['nocache'])) {
header('HTTP/1.0 302 Found');
header("Expires: ".gmdate("D, d M Y H:i:s", time()+315360000)." GMT");
header("Cache-Control: max-age=315360000");
}
header('Content-Type: image/jpeg');
header("Content-Disposition: attachment; filename='$archivo'");
readfile(AWS_BUCKET_URL .$archivo);
die();
答案 2 :(得分:1)
由于这个bug并不局限于Firefox(IE也试图将其保存为错误的类型,虽然它至少意识到它是一个图像),我猜想S3会返回错误的mime类型文件。
答案 3 :(得分:1)
当人们在其他论坛上提出这个问题时,我指出它们是this script的方向。你不必全部使用它,但它是一个很好的指针,正确的方向。
我不会写更多,因为其他人已经足够好地回答了这个问题。
答案 4 :(得分:0)
我曾经遇到过这个问题。我认为它的唯一真正的解决方法(当时)是在URL的末尾附加类似“#.jpg”的内容。这不应该影响您的处理,并将强制FF将下载类型设置为jpg。