2010-11-25 12 views
2

Je force le téléchargement d'une image sur mon site web.Forcer un téléchargement d'image en PHP. Fonctionne localement mais se brise sur le serveur Linux en direct

Le téléchargement forcé fonctionne correctement sur la machine de développement Apache/Windows.

Cependant, il pousse les caractères indésirables à l'écran en direct sur mon serveur Web Linux.

e.g. �����JFIF��H�H����6Exif��MM�*���� 
  • Firefox - indésirable
  • Chrome - camelote
  • Internet Explorer 7 - affiche l'image dans la page

    $fileName = basename($filePath); 
    $fileSize = filesize($filePath); 
    
    
    // Output headers. 
    header("Cache-Control: private"); 
    header("Content-Type: Image/jpeg"); 
    header("Content-Length: ".$fileSize); 
    header("Content-Disposition: attachment; filename=".$fileName); 
    
    
    // Output file. 
    readfile ($filePath);     
    exit(); 
    

Quelles différences peut-il y avoir sur mon serveur en direct qui le ferait rompre?

+0

question, vous voulez forcer le téléchargement pour ouvrir le fichier dans le navigateur? essayer de télécharger le fichier d'abord, et ouvrir avec des outils d'édition d'image pour vérifier le fichier de retour est valide – ajreal

+0

Je pense que vous vouliez dire [application/octet-stream] (http://tools.ietf.org/html/rfc2046#section-4.5.1). – Gumbo

+0

J'ai changé mon type de contenu en Image/Jpeg mais j'ai toujours le même problème –

Répondre

3

Chapeau pointe (et +1) à stillstanding, qui a souligné en utilisant fifo, mais je pensais donner un exemple ici pour vous aider. Cet exemple nécessite l'installation de l'extension fifo, et a été piraté et légèrement modifié à partir d'un autre de mes codes.

$filename = 'blarg.jpg'; 
    $filepath = '/foo/bar/blarg.jpg'; 
    $finfo = new finfo(FILEINFO_MIME); 
    $mime  = $finfo->file($file); 

    // Provide a default type in case all else fails 
    $mime = ($mime) ? $mime : 'application/octet-stream'; 

    header('Pragma: public'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-type: ' . $mime); 
    header('Content-Length: ' . filesize($filepath)); 
    header('Content-Disposition: attachment; filename="' . $filename . '"'); 

    header('Content-transfer-encoding: 8bit'); 
    header('Expires: 0'); 
    header('Pragma: cache'); 
    header('Cache-Control: private'); 
+0

1) Il est inutile de fournir un Content-Type par défaut. Si vous ne le savez pas, laissez-le. 2) Il n'y a pas d'en-tête Content-Transfer-Encoding dans HTTP. 3) L'en-tête Content-Disposition sera illégal dès que le nom de fichier contiendra des caractères hors ISO-8859-1. Voir RFC2231/5987 pour des conseils supplémentaires. –

+0

Merci, va vérifier cela. Existe-t-il une méthode suggérée pour gérer les caractères non ISO-8859-1? J'utilise simplement cette approche pour encourager le navigateur à télécharger des images et des vidéos, plutôt que de les afficher en ligne. En outre, quel est l'inconvénient de fournir application/octet-stream comme valeur par défaut? –

+0

L'encodage recommandé pour le nom de fichier est décrit dans RFC5987 et draft-ietf-httpbis-content-disposition (mais cela ne fonctionne pas dans tous les navigateurs). Une valeur par défaut de l'application/octet-stream est sans signification; il est inutile de le définir si vous ne connaissez pas le véritable encodage. –

2

Vous avez un type MIME incorrect dans l'en-tête. Utilisez finfo de sorte que vous puissiez envoyer le bon au lieu de tout transmettre en tant que application/stream, sinon le comportement du navigateur sera imprévisible.

1

Le type de contenu ne doit-il pas être défini sur image?

+0

Salut, j'ai essayé cela maintenant mais n'a toujours aucun effet. Y a-t-il autre chose que je peux vérifier? –