Как исправить Firefox, пытаясь «сохранить изображение как» .htm? - PullRequest
3 голосов
/ 19 декабря 2008

Недавно мы внедрили Amazon S3 на нашем сайте, что привело нас к изменению способа обработки изображений. Мы использовали для вызова контроллера /fotos.php, который считывал файл с диска, записывал некоторую статистику, устанавливал заголовки и возвращал содержимое файла как image / jpeg.

Все прошло нормально до S3. Fotos.php теперь выполняет редирект 302 на ресурс в Amazon, и все хорошо и работает, но вы не можете сохранить изображение в Firefox, потому что он устанавливает тип файла как .htm. Я нашел это обсуждение по этому вопросу, и похоже на ошибку в Firefox:

https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/207670

Вот URL-адрес проблемы (попробуйте сохранить большое изображение):

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 ]

5 голосов
/ 19 декабря 2008

Это не ошибка

Сам S3 не знает, что такое mimetype объект, который вы храните. Когда вы PUT объект в S3, вам также необходимо включить Content-Type и Content-Disposition заголовки (и все, что вы захотите). Когда вы сделаете это, S3 ответит этими значениями заголовка, когда вы или кто-либо еще, GET , является объектом

4 голосов
/ 19 декабря 2008

попробуйте указать тип содержимого изображения с header('Content-Type: image/jpeg'); или header('Content-Type: image/png');

возможно, вам придется использовать вложение для размещения контента, чтобы позволить 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");
} 

header('Content-Type: image/jpeg');
header("Content-Disposition: attachment; filename='$archivo'");
readfile(AWS_BUCKET_URL .$archivo);
die();
1 голос
/ 20 декабря 2008

Когда люди спрашивают об этом на других форумах, я указываю им в направлении этот скрипт . Вам не нужно использовать все это, но это хороший указатель в правильном направлении.

Я не буду писать больше, так как другие ответили достаточно хорошо.

1 голос
/ 19 декабря 2008

Так как эта ошибка не ограничивается Firefox (IE также пытается сохранить его как неправильный тип, хотя он по крайней мере понимает, что это изображение), я предполагаю, что S3 возвращает неправильный тип MIME для файл.

0 голосов
/ 19 декабря 2008

Я однажды столкнулся с этим вопросом. Я думаю, что единственный реальный обходной путь для этого (в то время) заключался в добавлении чего-то вроде «# .jpg» в конец URL. Это не должно повлиять на вашу обработку и заставит FF установить тип загрузки jpg.

...