2011-04-14 3 views
6

J'ai un problème avec la lecture de fichier pdf dans Chrome en utilisant PHP.Chrome a "Impossible de charger le document PDF" message d'erreur sur les PDF en ligne

Le code suivant est comment je fais en PHP

$path = "actually file path"; 
header("Pragma: public"); 
header("Expires: 0"); 
header("Content-type: $content_type"); 
header('Cache-Control: private', FALSE); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header("Content-Disposition: inline; filename=\"$filename\""); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length' . filesize($path)); 
ob_clean(); 
flush(); 
readfile($path); 

Ici, je mets le Content-Disposition inline. Parce que je veux afficher le fichier pdf si le navigateur de l'utilisateur dispose d'un plugin de visualisation de pdf intégré. Comme vous le savez peut-être, Chrome intègre un visualiseur PDF.

Le problème est que j'ai beaucoup de fichiers pdf sur le serveur. Seuls certains d'entre eux peuvent être consultés par Chrome. Je n'arrive pas à comprendre pourquoi les autres ne peuvent pas travailler de la même manière. J'ai vérifié la permission de chaque fichier. Cela ne ressemble pas au problème d'autorisation.

Est-ce que quelqu'un sait quel est le problème? Je vous remercie.

+2

Modifier pour forcer un téléchargement (Content-disposition: attachment/Content-Type: application/octet-stream), télécharger/enregistrer le bon PDF et un mauvais pdf et comparer ce qui a été enregistré à ce qui est sur le serveur. –

+0

@ Marc J'essaie ça. Les deux peuvent être téléchargés et ressemblent à la même chose. Je compare également cela avec le fichier dans le serveur. Ce sont les mêmes. Quand je reviens à Content-disposition: inline. Ça ne marche tout simplement pas. :(Je compare même l'en-tête de réponse, ils sont identiques – easycoder

+0

Que se passe-t-il si vous essayez d'en voir un directement au lieu de passer par votre script? –

Répondre

10

J'ai lutté avec ce même problème. C'est aussi proche que j'ai obtenu des résultats cohérents à travers les navigateurs. Je pense que la raison pour laquelle vous pourriez avoir des problèmes est si certains PDF sont trop grands pour readfile() pour gérer correctement. Essayez ceci:

$file = "path_to_file"; 
$fp = fopen($file, "r") ; 

header("Cache-Control: maxage=1"); 
header("Pragma: public"); 
header("Content-type: application/pdf"); 
header("Content-Disposition: inline; filename=".$myFileName.""); 
header("Content-Description: PHP Generated Data"); 
header("Content-Transfer-Encoding: binary"); 
header('Content-Length:' . filesize($file)); 
ob_clean(); 
flush(); 
while (!feof($fp)) { 
    $buff = fread($fp, 1024); 
    print $buff; 
} 
exit; 
+0

merci mingala .. va l'essayer. – easycoder

+1

il semble ne pas fonctionner correctement ... :( – easycoder

+1

Cela ne fonctionne pas pour un navigateur ou simplement Chrome? Vous pouvez essayer de modifier la taille de la mémoire tampon de 1024 à quelque chose de plus petit.Si fichier $ est réglé sur le chemin complet de votre document cette Notez également la variable $ myFileName dans l'un des en-têtes qui doit être défini ou supprimé – mingala

0

J'ai eu un problème similaire mais j'ai remarqué que l'ordre compte. Il semble que ; filename= doit avoir guillemets autour de lui, Content-Disposition: attachment Essayez ceci:

$file = "/files/test.pdf"; 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
    $mime = finfo_file($finfo, $file); 

    header('Pragma: public'); 
    header('Expires: 0'); 
    header('Content-Type: $mime'); 
    header('Content-Description: File Transfer'); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"')); 
    header('Content-Transfer-Encoding: binary'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Content-Length' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
1

je l'ai résolu de cette façon

$path = 'path to PDF file'; 
header("Content-Length: " . filesize ($path)); 
header("Content-type: application/pdf"); 
header("Content-disposition: inline; filename=".basename($path)); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
ob_clean(); 
flush(); 
readfile($path); 
1

eu le même problème, le chrome n'a pas afficher le PDF en ligne, coincé au chargement . La solution était d'ajouter header('Accept-Ranges: bytes').

Mon code complet:

header('Content-Type: application/pdf'); 
header('Content-Disposition: inline; filename="'.$title.'"'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.filesize($file)); 
header('Accept-Ranges: bytes'); 
header('Expires: 0'); 
header('Cache-Control: public, must-revalidate, max-age=0');