Pergunta

Temos recentemente implementado Amazon S3 em nosso site que nos levou a mudar a forma como lidamos com as imagens. Nós costumávamos chamar um /fotos.php controlador que iria ler o arquivo do disco, gravar algumas estatísticas, cabeçalhos definir e retornar o conteúdo do arquivo como image / jpeg.

Tudo correu bem até S3. Fotos.php agora faz um redirecionamento 302 para o recurso no Amazon e todos é agradável e de trabalho, mas você não pode salvar uma imagem no Firefox porque ele define seu tipo de arquivo como .htm. Eu encontrei esta discussão sobre o assunto, e parece que um bug no Firefox:

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

Aqui está uma URL com o problema (tentar salvar a imagem grande):

http: // www .viajeros.com / fotos / el-gran-lago-de-atitlan-y-sus-volcanes / 132968

Internet Explorer 6, pelo menos, tenta salvá-lo como Untitled.BMP.

Aqui está o trecho de código que usamos em 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;

Você conhece uma solução para isso?

EDIT:. Estamos usando CloudFront bem

Foi útil?

Solução

tentar especificar o tipo de conteúdo da imagem com header('Content-Type: image/jpeg'); ou header('Content-Type: image/png');

talvez você terá que usar anexo disposição do conteúdo para deixar PHP especificar o tipo de conteúdo (local de deixar a tarefa para o servidor 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();

Outras dicas

Não é um bug

si S3 não sabe o que mimeType o objeto que você armazene é. Quando você PUT o objeto no S3 é preciso também incluem Content-Type e Content-Disposition headers (eo que mais você pode querer). Quando você faz isso, S3 irá responder com esses valores de cabeçalho quando você, ou qualquer outra pessoa, get é o objeto

Uma vez que este bug não se restringe ao Firefox (IE também está tentando salvá-lo como o tipo errado, embora, pelo menos, percebe que é uma imagem), eu acho que S3 está retornando o tipo MIME errado para o arquivo.

Quando as pessoas perguntam isso em outros fóruns que eu apontá-los na direção do este script . Você não tem que usar tudo isso, mas é um ponteiro agradável na direção certa.

Eu não vou escrever mais como os outros responderam a esta bastante bem.

Eu corri para este problema me uma vez. Eu acho que a única solução real para ele (na época) era para acrescentar algo como "# .jpg" ao final da URL. Isso não deve afetar seu processamento e forçará FF para definir o tipo de download para jpg.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top