Le problème est résolu. En fait il ne venait pas du header envoyé.
Dans mon post j'ai mis trois méthodes, puis j'en ai essayé d'autres récupérées sur le net, forums, etc. Presqu'une dizaine ; et toujours le même message à l'arrivée.
Je me suis dit que bien que le header semble être une source de problèmes récurrente, ce dernier n'était peut-être pas en cause ici. Avec autant d'exemples différents de code, ça commençait à devenir logique ! Comme je suis débutant, que j'apprends, j'ai bien relu tout le code de la page (je m'étais inspiré du bouquin d'Olivier HEURTEL "PHP 5.2 Développer un site Web dynamique et interactif") et je voulais :
- lister les fichiers pdf d'un répertoire
- créer un lien précédé d'une image de fichier pdf pour pouvoir visualiser chaque fichier
- créer, à la suite du lien précedent, un lien sur une image de disquette pour télécharger ce même fichier.
et je n'avais pas mis
action="telechargements.php" dans le formulaire... puisque je restais dans le même fichier.
Comme la visualisation de chaque fichier pdf, avec la série de premiers liens se déroulant normalement dans le navigateur en localhost, j'ai imputé le téléchargement corrompu à la formulation du header. Comme c'est la première fois que je l'utilise et
qu'il est dit difficile je n'étais pas plus étonné que ça de rencontrer un problème...
Depuis ce rajout le message d'AcrobatReader a disparu et le fichier "téléchargé" en local s'ouvre correctement.
Je mets le code en entier peut-être que cela pourra aider d'autres débutants...
fichier telechargements.php
<?php
//Liste des documents.
$documents = array();
$rep = opendir("./pdf");
while ($fichier = readdir($rep)){
if($fichier != "." && $fichier != ".."){
$documents[] = $fichier;
}
}
closedir($rep);
//TTT du formulaire si $_POST n'est pas vide.
if(!empty($_POST)){
//Récupérer le n° du document : prendre la clé de la première ligne de $_POST, normalement du type n_x
//n étant le n° du document.
list($numéro) = each($_POST);
//Convertir la chaîne en entier, seul le n° reste.
$numéro = (integer) $numéro;
//En déduire le nom du document.
$nomFichier = $documents[$numéro];
//Le chemin.
$path = "./pdf/";
//Sa taille.
$poids = filesize($path.$nomFichier);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/pdf\n");
$header="Content-Disposition: attachment; filename=".$nomFichier;
header($header);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$poids);
@readfile($path.$nomFichier);
exit();
}
?>
<form name="telechargements" method="post" action="telechargements.php">
<table cellspacing="0">
<tr><th colspan="2">Visualiser</th><th>Télécharger</th></tr>
<?php
foreach($documents as $numéro => $document){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",
"<a href='./pdf/". $document ."' alt='Document PDF'><img src='./img_pres/ico/pdf20.png' /></a>",
"<a href='./pdf/". $document ."' alt='Document PDF'>".chaineTelechargement($document)." /></a>",
"<input type='image' name='$numéro' alt='Télécharger' src='./img_pres/ico/telecharger20.png'>");
}
?>
</table>
</form>
Merci à tous.
Le problème est résolu. En fait il ne venait pas du header envoyé.
Dans mon post j'ai mis trois méthodes, puis j'en ai essayé d'autres récupérées sur le net, forums, etc. Presqu'une dizaine ; et toujours le même message à l'arrivée.
Je me suis dit que bien que le header semble être une source de problèmes récurrente, ce dernier n'était peut-être pas en cause ici. Avec autant d'exemples différents de code, ça commençait à devenir logique ! Comme je suis débutant, que j'apprends, j'ai bien relu tout le code de la page (je m'étais inspiré du bouquin d'Olivier HEURTEL "PHP 5.2 Développer un site Web dynamique et interactif") et je voulais :
- lister les fichiers pdf d'un répertoire
- créer un lien précédé d'une image de fichier pdf pour pouvoir visualiser chaque fichier
- créer, à la suite du lien précedent, un lien sur une image de disquette pour télécharger ce même fichier.
et je n'avais pas mis [b]action="telechargements.php"[/b] dans le formulaire... puisque je restais dans le même fichier.
Comme la visualisation de chaque fichier pdf, avec la série de premiers liens se déroulant normalement dans le navigateur en localhost, j'ai imputé le téléchargement corrompu à la formulation du header. Comme c'est la première fois que je l'utilise et [b]qu'il est dit difficile[/b] je n'étais pas plus étonné que ça de rencontrer un problème...
Depuis ce rajout le message d'AcrobatReader a disparu et le fichier "téléchargé" en local s'ouvre correctement.
Je mets le code en entier peut-être que cela pourra aider d'autres débutants...
fichier telechargements.php
[php]<?php
//Liste des documents.
$documents = array();
$rep = opendir("./pdf");
while ($fichier = readdir($rep)){
if($fichier != "." && $fichier != ".."){
$documents[] = $fichier;
}
}
closedir($rep);
//TTT du formulaire si $_POST n'est pas vide.
if(!empty($_POST)){
//Récupérer le n° du document : prendre la clé de la première ligne de $_POST, normalement du type n_x
//n étant le n° du document.
list($numéro) = each($_POST);
//Convertir la chaîne en entier, seul le n° reste.
$numéro = (integer) $numéro;
//En déduire le nom du document.
$nomFichier = $documents[$numéro];
//Le chemin.
$path = "./pdf/";
//Sa taille.
$poids = filesize($path.$nomFichier);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/pdf\n");
$header="Content-Disposition: attachment; filename=".$nomFichier;
header($header);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$poids);
@readfile($path.$nomFichier);
exit();
}
?>
<form name="telechargements" method="post" action="telechargements.php">
<table cellspacing="0">
<tr><th colspan="2">Visualiser</th><th>Télécharger</th></tr>
<?php
foreach($documents as $numéro => $document){
echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",
"<a href='./pdf/". $document ."' alt='Document PDF'><img src='./img_pres/ico/pdf20.png' /></a>",
"<a href='./pdf/". $document ."' alt='Document PDF'>".chaineTelechargement($document)." /></a>",
"<input type='image' name='$numéro' alt='Télécharger' src='./img_pres/ico/telecharger20.png'>");
}
?>
</table>
</form>[/php]
Merci à tous.