8722 sujets

Développement web côté serveur, CMS

Bonjour,

Je développe actuellement un site personnel. J'y force le téléchargement d'un fichier PDF via le code suivant:

{
header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename=' . basename($chemin)); 
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($chemin));
readfile($chemin);
exit;
}


Le fichier est bien téléchargé, mais impossible de l'ouvrir par la suite, Adobe Reader affichant le message suivant:
Adobe Reader n'a pas pu ouvrir machin.pdf, car le type de fichier n'est pas pris en charge ou le fichier est endommagé (il a été envoyé en tant que pièce jointe et n'a pas été décodé correctement, par exemple).

Quelques précisions:
- le fichier téléchargé pèse ce qu'il faut (212Ko, comme l'original),
- ce n'est pas une histoire de mise à jour d'Adobe Reader puisque je possède l'original du PDF en question sur mon PC et qu'il s'ouvre sans souci,
- j'ai tenté de cacher la ligne Content-transfer-encoding, de changer Content-type en force-download, mais ça ne change rien.

Auriez-vous s'il vous plaît une idée lumineuse pour résoudre ce problème (avec l'explication qui va avec, j'aime bien comprendre les choses Smiley cligne ) ? Je suppose que c'est lié à la ligne d'encoding, mais bon...
Merci d'avance Smiley smile
Modifié par Toum (01 Mar 2013 - 12:22)
J'ai du nouveau concernant mon problème.

Lorsque je testais mon code jusqu'à hier, je testais tout depuis mon site (à savoir, un utilisateur clique sur un bouton "Acheter" > il est redirigé sur Paypal > mon site enregistre les données de la transaction en BDD quand le paiement est effectif > le téléchargement du document est lancé).

Souhaitant aller plus vite pour tester mes fameux headers, j'ai créé une page de test reprenant le code du premier message, en ajoutant simplement le lien de mon fichier PDF à la variable $chemin.

Et là, tout fonctionne ! Le fichier est lisible sans aucun souci.
Du coup, je m'interroge derechef. Qu'est-ce qui peut rendre un PDF illisible, auriez-vous une idée ? Smiley ohwell

Merci d'avance.
Bon, j'ai fini par résoudre mon problème, donc voilà la solution Smiley smile

En ouvrant le PDF invalide dans Open Office, je me suis rendu compte qu'il contenait les éléments HTML de ma page index avant le code PDF !
J'ai réalisé alors que j'appelais ma page de téléchargement via le code suivant:
header ('Location: index.php?page=telecharger&fichier=...')


(les pages classiques de mon site sont appelées de cette manière-là, ainsi je garde mon logo, mes menus, mon pied de page et je ne change que le contenu de la page proprement dite)

J'ai modifié l'appel de mon téléchargement de la manière suivante:
header ('Location: telecharger.php?fichier=...')


Et tout fonctionne :]

J'espère que ça pourra servir à d'autres personnes éventuellement !