[RESOLU] téléchargement d'un PDF avec liste déroulante méthode post

Romain.H
Invité n'ayant pas de compte PHPfrance

29 avr. 2011, 10:43

Bonjour à tous,

Je viens vers vous car je suis face à un problème.
J'ai construit une liste déroulante sur mon site, et j'aimerais qu'a travers cette liste déroulante on puisse télécharger des fichiers pdf.
C'est à dire, que l'on sélectionne une valeur de la liste déroulante, et lors de la pression sur le bouton envoyer, un téléchargement du fichier concerné se produise.
Voila le code que j'ai :

Code : Tout sélectionner

<form method="post" action="traitement.php"> <select name="dossierInf"> <option value="fichier1">mon fichier1</option> <option value="fichier2">mon fichier2</option> </select> <input type="submit" value="telecharger" /> </form>
Et sur le page traitement.php :

Code : Tout sélectionner

<?php $file = '../DossierInfo/'.$_POST['dossierInf'].'.pdf'; if (file_exists($file)) { echo "Le fichier $file existe."; } else { echo "Le fichier $file n'existe pas."; } header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename='.$file); readfile($file); ?>
Cependant une erreur lors de ce téléchargement se produit.
Le fichier téléchargé semble endommagé, et ne peut être ouvert par adobe reader.

Voici le message d'erreur :
"Adobe Reader n'a pas pu ouvrir avalanches.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 "

Avez-vous une idée d'ou provient cette erreur ? J'ai essayé tous les chemins possible, je ne trouve pas, mes fichiers existe pourtant bien.

Mon fichier traitement .php a ce chemin : \\gimli\www\wordpress\wp-content\themes\insight
Et mes fichiers pdf : \\gimli\www\wordpress\wp-content\themes\insight\DossierInfo

Mammouth du PHP | 672 Messages

29 avr. 2011, 11:48

Bonjour.

Pour débugger :
- echo realpath($_SERVER["SCRIPT_FILENAME"]); te donnera le chemin à prendre en compte...

- print_r($_POST); t'affichera le contenu de ton POST, histoire de vérifier.
Ne pas oublier que tu risques d'avoir des problèmes si ton nom de fichier contient des caractères "spéciaux" (même un bête espace). Au minimum, il faudra certainement faire un urldecode();

Au niveau de la logique, si le fichier n'existe pas tu ne voudras certainement pas l'ouvrir =>
if (file_exists($file)) {
    echo "Le fichier $file existe.";
	header('Content-type: application/pdf');
	header('Content-Disposition: attachment; filename='.$file);
	readfile($file);
} else {
    echo "Le fichier $file n'existe pas.";
}
Au niveau sécurité, il ne faut jamais utiliser les variables $_POST telles que.
Au minimum, supprime tout ce qui n'est pas alphanumérique dans $_POST['dossierInf']...

Edit : erreur de balises :oops:
Modifié en dernier par macgawel le 29 avr. 2011, 12:06, modifié 1 fois.

Eléphanteau du PHP | 27 Messages

29 avr. 2011, 11:58

remplace
$file = '../DossierInfo/'.$_POST['dossierInf'].'.pdf';
Par
$file = 'DossierInfo/'.$_POST['dossierInf'].'.pdf';

Eléphanteau du PHP | 27 Messages

29 avr. 2011, 12:49

Ah oui macgawel à raison "erreur de logique"donc ton code finale de "traitement.php" sera:

<?php
$file = 'DossierInfo/'.$_POST['dossierInf'].'.pdf';
if (file_exists($file)) {
        echo "Le fichier $file existe.";
        header('Content-type: application/pdf');
        header('Content-Disposition: attachment; filename='.$file);
        readfile($file);
}
else {
    echo "Le fichier $file n'existe pas.";
}
?>
Mais "echo "Le fichier $file existe.";" ne sert à rien car il ne sera pas envoyer au navigateur

Mammouth du PHP | 672 Messages

29 avr. 2011, 13:40

Mais "echo "Le fichier $file existe.";" ne sert à rien car il ne sera pas envoyer au navigateur
En fait, il risque même de générer des erreurs...
Si tu conserves ce code, que tu enregistres le fichier PDF et que tu l'ouvres avec un éditeur de texte, tu vas voir ton message... #-o

Une règle générale à retenir : ne rien afficher avant les header.

Romain.H
Invité n'ayant pas de compte PHPfrance

29 avr. 2011, 15:33

Problème résolu !!!
Voila le code final !!

<?php
$file = '/var/www/wordpress/wp-content/themes/insight/DossierInfo/'.$_POST['dossierInf'].'.pdf';

if (file_exists($file)) {
header("Content-type: application/force-download");
header('Content-Disposition: attachment; filename='.$file);
readfile($file);
exit;
} else {
echo "Le fichier $file n'existe pas.";
}
?>

Romain.H
Invité n'ayant pas de compte PHPfrance

29 avr. 2011, 15:35

Et oui, le "echo citant que le fichier existe", me rapportais effectivement une erreur.
Merci à tous ;)

Eléphant du PHP | 241 Messages

29 avr. 2011, 15:49

Salut,

pour un meilleur "confort" tu peux rajouter cette ligne, elle définit la taille du fichier et permet ainsi de savoir le temps de téléchargement restant et la taille du fichier
header("Content-Length: ".filesize($file));