forcer telechargement d'une image

forcer telechargement d'une image - PHP - Programmation

Marsh Posté le 09-01-2006 à 22:25:43    

Bonsoir, je cherche a forcer le telechargement d'une image quand je clic sur un lien, mais je n'y parviens pas.
J'ai trouvé ce site: http://www.destrucsaweb.com/ressou [...] oto_45.php  
mais j'obtient un resultat bizarre...
 
j'ai donc un fichier download.php qui contient le code suivant :  

Code :
  1. <?php
  2. // on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions
  3. switch(strrchr(basename($Fichier_a_telecharger), "." )) {
  4. case ".gz": $type = "application/x-gzip"; break;
  5. case ".tgz": $type = "application/x-gzip"; break;
  6. case ".zip": $type = "application/zip"; break;
  7. case ".pdf": $type = "application/pdf"; break;
  8. case ".png": $type = "image/png"; break;
  9. case ".gif": $type = "image/gif"; break;
  10. case ".jpg": $type = "image/jpeg"; break;
  11. case ".txt": $type = "text/plain"; break;
  12. case ".htm": $type = "text/html"; break;
  13. case ".html": $type = "text/html"; break;
  14. default: $type = "application/octet-stream"; break;
  15. }
  16. header("Content-disposition: attachment; filename=$Fichier_a_telecharger" );
  17. header("Content-Type: application/force-download" );
  18. header("Content-Transfer-Encoding: $type\n" ); // Surtout ne pas enlever le \n
  19. header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
  20. header("Pragma: no-cache" );
  21. header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public" );
  22. header("Expires: 0" );
  23. readfile($chemin . $Fichier_a_telecharger);
  24. ?>


 
Et le fichier qui fait appel a celui-ci via ce lien  :  
 

Code :
  1. <?
  2. ...
  3. echo "<a href=\"download.php?Fichier_a_telecharger=".$vimg."&chemin=images/".$vfolder."/original/\">Télécharger</a>";
  4. ...
  5. ?>


où $vimg contient le nom de fichier avec son extension, et $vfolder et le nom d'un repertoire (un album).
J'ai regarder l'url du lien, il est correct.  
 
Mais quand je clic dessus, j'obtient une page contenan des truc comme ça :  

Code :
  1. ÿØÿáþExif
  2. Šä¨ï+­FŒmžæ~«\D͌¶GÅx‡Hm;S`‘nÆ>íkEëäÈÆEiÝ##XdÓ^MçkœWQÀ'–Ú¼Òö¯’ÀŸ¥_°¸݇ŽjZ)F› *Ã#~ëp
  3. 1Ðɵ´Ù©ÜmäUù`t’sÚ¥»ü‘¤`¹oÔÖÐåim‚¡Ã!ÛZÞpÁYUƒzõÝx¯C̚´šó*If®Ä ºäŠÄñ³Ï
  4. etc.


 
Alors ou est-je faux?  
(testé sur une image .JPG)

Reply

Marsh Posté le 09-01-2006 à 22:25:43   

Reply

Marsh Posté le 10-01-2006 à 09:30:40    

Je ne savais pas qu'il était possible de forcer le téléchargement.
 
Si tu arrives a faire fonctionner ce script, je pourrais etre interessé  :)  
 
A priori, il t'affiche l'image jpg au format texte. J'aurais donc tendance a dire que ca vient de $type mais pourtant, ca a l'air bon (en supposant que le script fonctionne).

Reply

Marsh Posté le 10-01-2006 à 09:58:35    

essaie avec une image .jpg (écrit en minuscule). Si ça fonctionne, complète ton switch avec un strtolower.

Reply

Marsh Posté le 10-01-2006 à 10:14:25    

oui, ca semble juste etre un probleme de casse (JPG en majuscules).
Parce que le code a l'air correct (Content-disposition)


---------------
The Million Dollar Screenshot  (seo v7ndotcom elursrebmem paesys wifi)
Reply

Marsh Posté le 10-01-2006 à 13:03:29    

Trollable a écrit :

oui, ca semble juste etre un probleme de casse (JPG en majuscules).
Parce que le code a l'air correct (Content-disposition)


 
 
J'avais pensé a la casse, pour ça que j'ai rajouter d'ailleur une ligne dans download.php avec :  
case ".JPG": $type = "image/jpeg"; break;
 
 
Mais j'v essayer de passé une photo en min pour voir.
 
edit: non, meme chose....


Message édité par gargantua307 le 10-01-2006 à 13:08:15
Reply

Marsh Posté le 10-01-2006 à 16:35:17    

:bounce:

Reply

Marsh Posté le 10-01-2006 à 16:43:36    

tu peux toujours essayer de comparer avec celui-ci : http://thesmilingface.free.fr/pub/ [...] membre.php

Reply

Marsh Posté le 10-01-2006 à 17:35:47    

- ton header Content-Transfer-Encoding n'est pas valide (voir rfc)
- tu peux enlever la ligne 22 et mettre à la place header("Content-Type: $type" ); (voir http://fr2.php.net/header#AEN57793 )

Reply

Marsh Posté le 10-01-2006 à 17:37:13    

Hmmm, de mémoire (parce que c'est une technique que je suis loin d'utiliser tous les jours), tu mélangerais pas un peu le mime-type et le Content-Transfer-Encoding toi ?
 
Le CTE sert juste à préciser le format d'encodage : base64 ou binary par exemple, rien à voir avec le mime-type du fichier à priori (image/jpeg, ce serait plutôt du content-type...)
 
//edit : owned par soju :D


Message édité par naceroth le 10-01-2006 à 17:38:22
Reply

Marsh Posté le 10-01-2006 à 20:18:20    

soju a écrit :

- ton header Content-Transfer-Encoding n'est pas valide (voir rfc)
- tu peux enlever la ligne 22 et mettre à la place header("Content-Type: $type" ); (voir http://fr2.php.net/header#AEN57793 )


 
donc j'ai fait la modif que tu m'as indiqué, voici ce que j'ai maintenant donc :  

Code :
  1. <?php
  2. // on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions
  3. switch(strrchr(basename($Fichier_a_telecharger), "." )) {
  4. case ".gz": $type = "application/x-gzip"; break;
  5. case ".tgz": $type = "application/x-gzip"; break;
  6. case ".zip": $type = "application/zip"; break;
  7. case ".pdf": $type = "application/pdf"; break;
  8. case ".png": $type = "image/png"; break;
  9. case ".gif": $type = "image/gif"; break;
  10. case ".JPG": $type = "image/jpeg"; break;
  11. case ".jpg": $type = "image/jpeg"; break;
  12. case ".txt": $type = "text/plain"; break;
  13. case ".htm": $type = "text/html"; break;
  14. case ".html": $type = "text/html"; break;
  15. default: $type = "application/octet-stream"; break;
  16. }
  17. header("Content-disposition: attachment; filename=$Fichier_a_telecharger" );
  18. header("Content-Type: $type" );
  19. header("Content-Transfer-Encoding: binary" );
  20. header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
  21. header("Pragma: no-cache" );
  22. header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public" );
  23. header("Expires: 0" );
  24. readfile($chemin . $Fichier_a_telecharger);
  25. ?>


 
Malheureusement, j'ai tjr le meme resultat :(
A savoir : affichage son forme de code du contenu de l'image.
 
Je ne maitrise pas du tout les en-tetes, alors j'suis un peu largué.
J'vais essayer d'allé jeter un oeil au lien pour m'instruire.
 
Mais si vous comprennez pourquoi ça ne marche tjr pas...!
 
 
Pour voir ce que ça me donne :  
 
http://www.gargant.info/albumPhoto [...] /original/


Message édité par gargantua307 le 10-01-2006 à 20:27:32
Reply

Marsh Posté le 10-01-2006 à 20:18:20   

Reply

Marsh Posté le 10-01-2006 à 23:28:20    

Response Headers - http://www.gargant.info/albumPhoto/download.php?Fichier_a_telecharger=belette3.JPG&chemin=images/cat1136725788/original/
 
Date: Tue, 10 Jan 2006 22:23:11 GMT
Server: Apache/1.3.33 (Unix)
X-Powered-By: PHP/4.4.1
Keep-Alive: timeout=2, max=200
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
 
200 OK

tes headers ne fonctionnent pas :
- verifie qu'il n'y a rien avant <?php
- met un error_reporting(E_ALL); au début de ton script
 
PS: firefox + extension web developer => ça aide pour le debug

Reply

Marsh Posté le 11-01-2006 à 07:53:21    

soju a écrit :

Response Headers - http://www.gargant.info/albumPhoto/download.php?Fichier_a_telecharger=belette3.JPG&chemin=images/cat1136725788/original/
 
Date: Tue, 10 Jan 2006 22:23:11 GMT
Server: Apache/1.3.33 (Unix)
X-Powered-By: PHP/4.4.1
Keep-Alive: timeout=2, max=200
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
 
200 OK

tes headers ne fonctionnent pas :
- verifie qu'il n'y a rien avant <?php
- met un error_reporting(E_ALL); au début de ton script
 
PS: firefox + extension web developer => ça aide pour le debug


 
Alors là!
J'ai supprimer un espace devant mon <? au tout début, et ça marche! O_o
En tout cas, merci pour votre aide!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed