如何修复Firefox试图“将图像另存为”.htm?

时间:2008-12-19 19:29:16

标签: php firefox redirect mime-types

我们最近在我们的网站上实施了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。

5 个答案:

答案 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。