Précédent   Forum des professionnels en informatique > PHP > Outils
Outils Forum d'entraide sur les outils pour développeurs PHP : EDI, installation, administration... Avant de poster : FAQ outils, toutes les FAQ PHP et les comparatifs
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/05/2007, 19h15   #1
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
Par défaut [Conception] Script de téléchargement d'image

Bonjour,
j'ai un script me permétant de télécharger une image, mon souci c'est que ca le télécharge mais pas a la bonne extension, soit en image.html au lieu de image.jpg par exemple.
voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
<?
  $filename = $_GET['name'];  //nom du fichier
 
 
$file_path = $_GET['file']; //completer le nom du fichier
 
//0. Ouverture et lecture du fichier, puis fermeture
$ofile = fopen ($file_path, 'rb'); //Forcage du mode binaire sous windows. CF doc PHP fonction fopen
$content = fread($ofile, filesize($file_path));
fclose ($ofile);
//0. fin
 
//1. Envoie des headers corrects. ok navigateur (opera 9, fx 1.0, ie 6)
header('Content-Transfer-Encoding: none'); //Si omis -> bug opera cf. post 1ere page
header('Content-Type: application/octet-stream ');
header("Content-Disposition: attachment; filename=$filename");
header('Content-length: '.filesize($file_path));
//1. fin
 
// envoi du fichier au navigateur
echo $content;
?>
merci.
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2007, 11h43   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Pourrait-on avoir un exemple (URL et description des variables passées dans l'URL) ? L'erreur est sans doute sur $filename donc lors du passage de $_GET['name'].

Note : les balises courtes (<? et <?=) sont déconseillées pour des raisons de portabilité.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 21h47   #3
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
un exemple d'URL :
tele.php?file=imgupdate/05052007/2158745896542.jpg&name=shaman

Voila,

Merci.
(Désolée pour le retard)
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 22h13   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Le code est-il complet ? Est-ce un problème spécifique à un navigateur ? Parce que là, je ne vois pas d'où cela peut venir.

PS : à noter qu'un code "équivalent" est proposé dans la FAQ.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 22h24   #5
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
Sur IE : il enregistre le fichier en .html et sous firefox, il l'enregistre en (application/octet-stream) ...

et oui c'est le code complet que je vous est affiché.

Merci.
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 22h39   #6
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
J'avoue ne pas comprendre completement le code du FAQ ... une petite esplication?
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h11   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
define('CFG_SYSTEM_FILENAME', 'fichier.ext');
On définit, sous la forme d'une constante, le fichier local (ie : sur le système du serveur) à envoyer. Pour vous ce serait $_GET['file'] comme deuxième paramètre (mais vérifiez que vous n'envoyez pas un fichier autre que désiré - fichiers système notamment).

Code :
define('CFG_SEND_FILENAME', CFG_SYSTEM_FILENAME);
Nom sous lequel le fichier sera téléchargé par le navigateur. Pour vous ce serait $_GET['name'] (pour le deuxième paramètre).

Vous n'avez ensuite pas besoin de modifier quoi que ce soit.

Code :
define('CFG_FILESIZE', filesize(CFG_SYSTEM_FILENAME));
Taille du fichier que l'on définit sous la forme d'une constante pour réutilisation dans les entêtes.

Code :
define('CFG_FILE_MD5', md5_file(CFG_SYSTEM_FILENAME));
Calcul du hash MD5 du fichier (une sorte de somme de contrôle).

Code :
define('CFG_DATE_FORMAT', 'D, d M Y H:i:s');
Le format de la date à employer.

Nous nous assurons ainsi de n'afficher aucune erreur. L'affichage d'une erreur (ou tout autre texte) ne nous permettrait pas d'envoyer les entêtes (fonctions header).

Code :
ini_set('zlib.output_compression', 0);
On désactive, pour le script courant, la compression des données par le serveur.

Après ce ne sont que des entêtes où l'on retrouve à peu près ce que vous aviez écrit et readfile qui est l'équivalent de votre boucle de lecture du fichier.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 19h15   #8
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
  $filename = $_GET['name'];  //nom du fichier
 
 
$file_path = $_GET['file']; //completer le nom du fichier
 
 
//
// Constantes de configuration
//
 
define('CFG_SYSTEM_FILENAME', $file_path); // Nom du fichier pour le système
define('CFG_SEND_FILENAME', $filename); // Nom du ficher pour le navigateur
Le fichier se propose en téléchargement, mais il n'y a pas d'extension , donc j'ai simplement le nom sans extension...(je suis obligé de rajouté l'extension une fois l'image enregistré pour pouvoir la voir)
Merci.
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 19h25   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par mimagyc
Le fichier se propose en téléchargement, mais il n'y a pas d'extension , donc j'ai simplement le nom sans extension...(je suis obligé de rajouté l'extension une fois l'image enregistré pour pouvoir la voir)
ça vient de ce que vous passez par l'URL (paramètre name) : s'il manque l'extension à ce niveau, ça se répercute en toute logique sur le reste
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 22h11   #10
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115

...

désolé

mais ca ne marche toujours pas, maintenant dans mon url j'ai
Citation:
tele2.php?file=imgupdate/27052007/0601837001180288676.jpg&name=shaman.jpg
(A noter que l'extension est directement dans l'url variable name)

Et la page m'affiche l'image au lieu de me proposer un téléchargement...
on va y arrivé

Rappelle :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
<?
  $filename = $_GET['name'];  //nom du fichier
$file_path = $_GET['file']; //completer le nom du fichier
// Constantes de configuration
define('CFG_SYSTEM_FILENAME', $file_path); // Nom du fichier pour le système
define('CFG_SEND_FILENAME', $filename); // Nom du ficher pour le navigateur
// Constantes à ne pas modifier
define('CFG_FILESIZE', filesize(CFG_SYSTEM_FILENAME));
define('CFG_FILE_MD5', md5_file(CFG_SYSTEM_FILENAME));
define('CFG_DATE_FORMAT', 'D, d M Y H:i:s');
// Quelques éléments nécessaires
error_reporting(0);
ini_set('zlib.output_compression', 0);
//Les en têtes nécessaires
// Gestion du cache
header('Pragma: public');
header('Last-Modified: '.gmdate(CFG_DATE_FORMAT).' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
// Informations sur le contenu à envoyer
header('Content-Tranfer-Encoding: none');
header('Content-Length: '.CFG_FILESIZE);
header('Content-MD5: '.base64_encode(CFG_FILE_MD5));
header('Content-Type: application/octetstream; name="'.CFG_SEND_FILENAME.'"');
header('Content-Disposition: attachement; filename="'.CFG_SEND_FILENAME.'"');
// Informations sur la réponse HTTP elle-même
header('Date: '.gmdate(CFG_DATE_FORMAT, time()).' GMT');
header('Expires: '.gmdate(CFG_DATE_FORMAT, time()+1).' GMT');
header('Last-Modified: '.gmdate(CFG_DATE_FORMAT, time()).' GMT');
// Envoi du fichier
readfile(CFG_SYSTEM_FILENAME);
?>
edit : si je ne met pas l'extension au bout du fichier, il me propose un téléchargement mais sans extension
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 19h41   #11
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
je vien de tester, et ca marche sous firefox ...
Merci.
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 23h52   #12
Membre habitué
 
Avatar de mimagyc
 
Inscription : novembre 2006
Messages : 310
Détails du profil
Informations personnelles :
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2006
Messages : 310
Points : 115
Points : 115
Apres plusiuer lecture sur les tutorials ,
j'ai réussi

voici ma réponse donc ^^
Les variable passe par L'URL.
-$filename => le nom qui apparaitera au téléchargement.(image.jpg)
- $file=> chemin du fichier (www/dossier/image.jpg).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<?
 
$filename = $_GET['name'];  //nom du fichier
 
$file=$_GET['file']; //chemin du fichier
 
//telechargement 
$taille=filesize("$file"); 
header("Content-Type: application/force-download; name=\"$file\""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: $taille"); 
header("Content-Disposition: attachment; filename=".$filename); 
header("Expires: 0"); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Pragma: no-cache"); 
readfile("$file"); 
exit(); 
?>
Merci au personne qui m'ont aidé.
mimagyc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h02.


 
 
 
 
Partenaires

Hébergement Web