web-dev-qa-db-fra.com

en-têtes corrects PHP pour le téléchargement de fichiers pdf

J'ai vraiment du mal à faire ouvrir mon pdf à mon application lorsque l'utilisateur clique sur un lien.

Jusqu'à présent, la balise d'ancrage redirige vers une page qui envoie des en-têtes qui sont:

$filename='./pdf/jobs/pdffile.pdf;

$url_download = BASE_URL . RELATIVE_PATH . $filename;


header("Content-type:application/pdf");



header("Content-Disposition:inline;filename='$filename");

readfile("downloaded.pdf");

cela ne semble pas fonctionner, est-ce que quelqu'un a réglé ce problème avec succès dans le passé?

60
useyourillusiontoo

L'exemple 2 sur w3schools montre ce que vous essayez d'atteindre.

<?php
header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");

// The PDF source is in original.pdf
readfile("original.pdf");
?>

Rappelez-vous aussi que,

Il est important de noter que header () doit être appelé avant toute sortie réelle (Dans PHP 4 et versions ultérieures, vous pouvez utiliser la mise en mémoire tampon de sortie pour résoudre ce problème)

113
gat
$name = 'file.pdf';
//file_get_contents is standard function
$content = file_get_contents($name);
header('Content-Type: application/pdf');
header('Content-Length: '.strlen( $content ));
header('Content-disposition: inline; filename="' . $name . '"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
echo $content;
22
Marin Vartan

Certaines choses doivent être prises en compte dans votre code.

Commencez par écrire ces en-têtes correctement. Vous ne verrez jamais aucun serveur envoyer Content-type:application/pdf, l'en-tête est Content-Type: application/pdf, avec une espacement, avec les premières lettres en majuscules, etc.

Le nom de fichier dans Content-Disposition est le nom de fichier uniquement, pas le chemin complet, et je ne sais pas si c'est obligatoire ou non, ce nom est encapsulé dans " pas '. De plus, votre dernier ' est manquant.

Content-Disposition: inline implique que le fichier doit être affiché et non téléchargé. Utilisez attachment à la place.

En outre, définissez l'extension de fichier en majuscule pour la rendre compatible avec certains appareils mobiles.

Ceci étant dit, votre code devrait ressembler davantage à ceci:

<?php

    $filename = './pdf/jobs/pdffile.pdf';

    $fileinfo = pathinfo($filename);
    $sendname = $fileinfo['filename'] . '.' . strtoupper($fileinfo['extension']);

    header('Content-Type: application/pdf');
    header("Content-Disposition: attachment; filename=\"$sendname\"");
    header('Content-Length: ' . filesize($filename));
    readfile($filename);

Content-Length est facultatif, mais il est également important si vous souhaitez que l'utilisateur puisse suivre l'évolution du téléchargement et détecter si le téléchargement a été interrompu. Mais lorsque vous l'utilisez, vous devez vous assurer de ne rien envoyer avec les données du fichier. Assurez-vous qu'il n'y a absolument rien avant <?php ou après ?>, pas même une ligne vide.

6
Havenard

J'ai eu le même problème récemment et cela m'a aidé:

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="FILENAME"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize("PATH/TO/FILE")); 
    ob_clean(); 
    flush(); 
    readfile(PATH/TO/FILE);      
    exit();

J'ai trouvé cette réponse ici

3
haayek

Pouvez-vous essayer ceci, readfile a besoin du chemin complet du fichier.

        $filename='/pdf/jobs/pdffile.pdf';            
        $url_download = BASE_URL . RELATIVE_PATH . $filename;            

        //header("Content-type:application/pdf");   
        header("Content-type: application/octet-stream");                       
        header("Content-Disposition:inline;filename='".basename($filename)."'");            
        header('Content-Length: ' . filesize($filename));
        header("Cache-control: private"); //use this to open files directly                     
        readfile($filename);
1
Krish R

Vous devez définir la taille du fichier ...

header('Content-Length: ' . filesize($file));

Et cette ligne est fausse:

en-tête ("Content-Disposition: inline; filename = '$ filename");

Vous avez foiré les quotas.

0
Flash Thunder