Bonjour à tous !

Je viens vers vous aujourd'hui car un problème s'oppose à moi et je n'arrive pas à le résoudre malgré les recherches mené sur google.
Je dispose d'un site web contenant une page de formulaire avec possibilité d'y joindre une pièce jointe. Le formulaire est récupéré sur une autre page ou il est ajouter à une liste d'annonce . la pièce jointe quant à elle est déplacer dans un de mes dossier.

Voila je souhaiterais maintenant ajouter pour chacune des annonces, un lien " Télécharger l'annonce complète " qui, lorsque l'on clique dessus, télécharge la pièce jointe correspondante depuis le dossier ou sont stockés mes pièces jointes.

J'ajoute que mes pièces jointes, une fois déplacer sont renommés de tel sorte à ce que l'ID de l'annonce stocké dans la bdd et le nom de ce fichier soit identique.

Je suis totalement perdu pour le download ! aidez moi s'il vous plaît ! :/

Cordialement.

12 réponses


Vallyan
Réponse acceptée

La solution la plus simple est de placer l'attribut download (html5) dans ta balise <a>:

<a href="../../wp-content/uploads/Offres/<?php echo $donnees'id_offre']?>.<?php echo $donnees'extension']?>" download>Voir l'annonce complète</a>

Une solution un peu plus robuste consisterait a passer par un fichier php:

  • Au lieu de mettre un lien directement vers l'image, tu mets un lien vers un fichier php avec le nom du fichier a télécharger en get:

    <a href="download.php?img=<?php echo $donnees'id_offre']?>.<?php echo $donnees'extension']?>">Voir l'annonce complète</a>

  • Dans ton fichier download.php, tu récupères le nom de l'image ($_GET'img']), et tu envoies les headers qu'il faut pour assurer le download:

    <?php
    $file = "../../wp-content/uploads/Offres/" . $_GET'img'];
    header("Content-Type: application/octet-stream");
    header("Content-Length: " . filesize( $file ));
    header("Content-Disposition: attachment; filename=" . $_GET'img']);
    readfile($file);
    ?>

  • Pense aussi a faire les vérifs que ton image existe, etc ...

Vallyan
Réponse acceptée

Il t'ouvre une nouvelle page parce qu'il ne trouve pas le document a renvoyer. Je viens de faire le test en local, et lorsqu'il y a bien une image il n'ouvre pas de nouvelle page.

Ligne 17 de ton code, ajoute ceci:

echo __DIR__.$file; die();

et vérifie quelle est l'uri du fichier que tu es sensé utiliser. Vérifie qu'il n'y a pas de faute d'artographe ou autre ...

Je ne comprends pas bien pourquoi la méthode html 5 ne te convient pas ? Elle est effectivement modifibale coté client, mais je ne vois pas ou est le probleme puisque la désactiver ne présente pas de faille de sécurité, cela afficherait juste le truc dans le navigateur au lieu de le telecharger. Faudrait etre pas mal débile pour modifier cela en tant qu'utilisateur de ton site ^^

un simple lien vers le fichier en question suffit.

Nyssix
Auteur

Alors mes annonces s'affichent grâce un while qui récupère à la suite toute les différentes annonces envoyer via le formulaire .. ce lien devra donc changer selon l'annonce .. du coup pour le href j'ai vraiment du mal à savoir comment le faire pointer ... sur le net j'ai vu beaucoup de solutions avec une page spécifique download.php et des header à l'intérieur .. mais je n'y comprend vraiment pas grand chose dans cette partie là c'est le flou total =( ..

Si tu mes tous tes fichiers dans un meme dossier (disons: /files/) et vu que tu leur donnes comme nom de l'id de l'annonce, tu peux facilement construire tes url comme ceci:

<a href="/files/<?php echo $row'id']; ?>.doc">Télécharger le fichier</a>

(a adapter pour que ce soit l'id de l'annonce courante dans ton while qui s'affiche)

Nyssix
Auteur

Alors j'ai tenté dans mon cas cela donne :
<a href="./wp-content/uploads/Offres/<?php echo $donnees'id_offre']; ?>.jpg">Télécharger le fichier</a>
cependant cela m'ouvre une nouvelle page en me disant que celle-ci est introuvable . De plus, mes documents me peuvent avoir soit l'extension jpg, soit png, soit pdf, soit txt ..

Ah.

Alors pour le truc de la page introuvable, c'est que tu te plantes sur l'url ou sur sur le nom de fichier. Je suppose que dans le cas de ton test le nom de fichier eest bon, c'est donc probablement l'url qui foire. Essaye de mettre une url absolue plutot que relative, déja. Sinon tu peux utiliser __DIR__ pour te placer correctement par rapport au fichier courant:

1/ Place ceci dans ton code:

<a href=""> <?php echo __DIR__ ; ?> </a>

juste pour voir ou tu es excatement.

2/ Puis ajoute ensuite le path vers ton dossier dans le href, en partant de __DIR__:

<a href="<?php echo __DIR__. '/../../wp-content/uploads/Offres/' . $donnees'id_offre'] . '.jpg'; ?>">Télécharger le fichier</a>

(je mets n'importe quoi pour l'exemple, a toi de retrouver le chemin vers ton dossier).

3/ Enfin pour ce qui est de l'extension:
* Soit tu fait une petite fonction php qui cherche tous les fichiers, dans le dossier ou tu les stockes, qui portent un nom particulier. A partir de la tu peux retrouver la ou les extensions.
* Soit tu stockes en BDD l'extension au moment de l'upload, et tu la récupère ensuite pour mettre la bonne directement.

Nyssix
Auteur

Me revoila ! j'ai modifier le lien en :
<a href="../../wp-content/uploads/Offres/<?php echo $donnees'id_offre']?>.<?php echo $donnees'extension']?>">Voir l'annonce complète</a>
et depuis cela m'affiche bien l'image ! j'ai aussi récupérer l'extension dans la bdd, je n'ai plus le soucis quant à elle, cependant j'aimerais forcer le téléchargement de l'objet si possible ! car pour le moment ça me l'ouvre seulement !

Nyssix
Auteur

Bonjour,

Encore une fois merci d'avoir pris le temps de me répondre.
Sachant que mes fichiers peuvent être png, jpg, pdf ou txt, j'ai chercher un petit peu sur internet le moyen de trier les extensions, et en combinant avec votre méthode j'obtient cela dans le ficheir download.php :

<?php
$objet=$_GET'img'];
$file = "../../wp-content/uploads/Offres/".$objet;
switch(strrchr(basename($objet), ".")) {
case ".pdf": $type = "application/pdf"; break;
case ".png": $type = "image/png"; break;
case ".jpg": $type = "image/jpeg"; break;
case ".txt": $type = "text/plain";break;
default: $type = "application/octet-stream";break;

}

header("Content-disposition: attachment; filename=".$objet); 
header("Content-Type: application/force-download"); 
header("Content-Transfer-Encoding:".$type."\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($file)); 
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
header("Expires: 0"); 
readfile($file); 

?>

dans mon lien j'ai: <a href="download.php?img=<?php echo $donnees'id_offre']?>.<?php echo $donnees'extension']?>">Voir l'annonce complète</a>

Cependant, que ce soit cette méthode ou seulement la votre, je tombe sur une page non trouvé lorsque je clique sur le lien.

Pourriez vous m'expliquer ce qui cause cette erreur ?

Cordialement.

c'est juste qu'il ne trouve pas download.php.
Mit un echo de __DIR__ pour voir ou tu es dans ton arborescence, et modifie le href en conséquence.

Nyssix
Auteur

Pourtant je suis bien dans le dossier ou se trouve download.php!

En fait ça m'ouvre bien la page, dans l'url, mais sur le site cela me dit que le contenu est introuvable, hors, ce code est censé forcer le téléchargement et non pas ouvrir une page.. la méthode html5 marche très bien, mais il est facile d'enlever cela en simple clique, c'est pour cela que j'essaye de réussir avec cette méthode !

Nyssix
Auteur

En fait je vais garder la méthode HTML5, mon problème était qu'une personne ayant modifier le code HTML pouvait par la suite, via l'url naviguer dans mes fichiers. Cependant grâce à la modification du .htaccess il est possible d'empêcher cela, j'ai fait la modification, donc je peux garder la méthode HTML5.

Je tiens a remercier brandon-xprodeur, et surtout, Vallyan, pour avoir suivi ce sujet et m'avoir aider à comprendre et faire la partie DLD.

Vous m'avez vraiment appris des choses, et je vous en remercie !