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é?
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)
$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;
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.
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
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);
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.