IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Conception] Script de téléchargement d'image


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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é.

  3. #3
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    un exemple d'URL :
    tele.php?file=imgupdate/05052007/2158745896542.jpg&name=shaman

    Voila,

    Merci.
    (Désolée pour le retard)

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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.

  5. #5
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    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.

  6. #6
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    J'avoue ne pas comprendre completement le code du FAQ ... une petite esplication?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    define('CFG_FILE_MD5', md5_file(CFG_SYSTEM_FILENAME));
    Calcul du hash MD5 du fichier (une sorte de somme de contrôle).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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

  10. #10
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut

    ...

    désolé

    mais ca ne marche toujours pas, maintenant dans mon url j'ai
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    je vien de tester, et ca marche sous firefox ...
    Merci.

  12. #12
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. script de téléchargement d'image
    Par Blo0d4x3 dans le forum Langage
    Réponses: 1
    Dernier message: 26/05/2006, 15h47
  2. script pour téléchargement
    Par polace dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2006, 16h34
  3. [Conception] affichage aleatoire d'une image
    Par bellebiquette dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 24/02/2006, 22h58
  4. [ImageMagick] Téléchargement d'image aléatoire ?
    Par artotal dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 20/12/2005, 01h21
  5. Téléchargement d'image
    Par bubble_gum dans le forum ASP
    Réponses: 6
    Dernier message: 12/05/2005, 23h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo