Question

Nous avons récemment mis en place Amazon S3 sur notre site qui nous a permis de changer la façon dont nous traitons les images. Nous avons l'habitude d'appeler un /fotos.php contrôleur qui lit le fichier à partir du disque, enregistrer quelques statistiques, mis en-têtes et retourner le contenu du fichier comme image / jpeg.

Tout est allé OK jusqu'à ce que S3. Fotos.php fait maintenant une redirection 302 à la ressource en Amazonie et tout est agréable et travailler, mais vous ne pouvez pas enregistrer une image dans Firefox, car il définit son type de fichier .htm. J'ai trouvé cette discussion sur la question, et il semble comme un bug dans Firefox:

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

Voici une URL présentant le problème (essayez de sauver la grande image):

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

Internet Explorer 6 au moins essaie de l'enregistrer comme untitled.bmp.

Voici l'extrait de code que nous utilisons dans 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;

Savez-vous une solution de contournement pour cela?

EDIT:. Nous utilisons CloudFront et

Était-ce utile?

La solution

essayez de spécifier le type de contenu de l'image avec header('Content-Type: image/jpeg'); ou header('Content-Type: image/png');

peut-être vous devrez utiliser la fixation de disposition de contenu pour laisser PHP spécifier le type de contenu (emplacement laisser la tâche au serveur 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();

Autres conseils

Il est pas un bug

S3 lui-même ne sait pas ce que MIMETYPE l'objet stocké est. Lorsque vous PUT l'objet S3 vous devez inclure également Content-Type et Content-Disposition en-têtes (et tout ce que vous voudrez peut-être). Lorsque vous le faites, S3 répondra avec ces valeurs d'en-tête lorsque vous, ou quelqu'un d'autre, GET de l'objet

Étant donné que ce bug ne se limite pas à Firefox (IE essaie aussi de l'enregistrer comme un mauvais type, bien au moins se rend compte qu'il est une image), je suppose que S3 retourne le mauvais type MIME pour la fichier.

Quand les gens demandent ce sur d'autres forums, je leur point dans la direction de cette script. Vous ne devez pas utiliser tous, mais son un pointeur agréable dans la bonne direction.

J'écris coutume plus que les autres ont répondu à cette assez bien.

Je suis tombé sur cette question moi-même une fois. Je pense que la seule solution réelle pour elle (à l'époque) était d'ajouter quelque chose comme « # .jpg » à la fin de l'URL. Cela ne devrait pas affecter votre traitement et forcera FF à définir le type de téléchargement au format JPG.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top