3 votes

Forcer le téléchargement d'une image en PHP. Fonctionne localement mais ne fonctionne pas sur un serveur Linux.

Je force le téléchargement d'une image par le biais de mon site web.

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

Cependant, il affiche des caractères inutiles à l'écran lorsqu'il est utilisé sur mon serveur web linux.

e.g. JFIFHH6ExifMM*
  • Firefox - courrier indésirable
  • Chrome - déchets
  • 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 sont les différences qui pourraient exister sur mon serveur en direct et qui provoqueraient une rupture ?

4voto

El Yobo Points 7580

Coup de chapeau (et +1) à encore debout qui a souligné l'utilisation fifo mais j'ai pensé 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');

2voto

stillstanding Points 10346

Vous avez un type MIME incorrect dans l'en-tête. Utilisez finfo afin de pouvoir envoyer la bonne au lieu de tout transmettre comme une application/stream sinon le comportement du navigateur sera imprévisible.

1voto

Jim Points 13533

Le Content-Type ne devrait-il pas être défini comme une image ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X