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

Langage PHP Discussion :

[CSV] Proposer le téléchargement d'un fichier


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut [CSV] Proposer le téléchargement d'un fichier
    Bonjour,

    J'ai essayé le code indiqué dans la FAQ, mais j'ai du mal l'essayer car mon fichier .csv apparait directement dans ma page en texte et je n'ai pas la boite de dialogue de téléchargement.
    http://php.developpez.com/faq/?page=..._forcedownload

    J'ai du coup repris un vieux fichier qui lui fonctionnait et qui ne me semblait pas bien différent.

    Alors je ne sais pas trop ...
    j'ai utilisé votre code en le mettant dans une fonction que j'appelle depuis la page où je génère mon fichier en passant son nom en paramètre.

    Par contre, le fichier que j'utilise, lui, contient ça au début :

    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
    <?php 
     
    // on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions 
     
    $fich=$_REQUEST["Fichier_a_telecharger"];
    $chem=$_REQUEST["chemin"];
    switch(strrchr(basename($_REQUEST["Fichier_a_telecharger"]), ".")){
     
    case ".gz": $type = "application/x-gzip"; break;
    case ".tgz": $type = "application/x-gzip"; break;
    case ".zip": $type = "application/zip"; break;
    case ".pdf": $type = "application/pdf"; break;
    case ".png": $type = "image/png"; break;
    case ".gif": $type = "image/gif"; break;
    case ".jpg": $type = "image/jpeg"; break;
    case ".txt": $type = "text/plain"; break;
    case ".htm": $type = "text/html"; break;
    case ".html": $type = "text/html"; break;
    case ".txt": $type = "text/html"; break;
    default: $type = "application/octet-stream"; break;
     
    }
     
    header("Content-disposition: attachment; filename=$fich"); 
    header("Content-Type: application/force-download"); 
    header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
    header("Content-Length: ".filesize($chem . $fich)); 
    header("Pragma: no-cache"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
    header("Expires: 0"); 
    readfile($chem . $fich); 
    ?>
    et ensuite c'est de l'html classique et sans contenu sauf le titre

    et il est appelé par un lien du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="telecharge.php?Fichier_a_telecharger=nomFichier"&chemin=nomDossier
    Peut-être est-ce ce qu'il fallait faire aussi avec votre code, mais, en ce cas, peut-être faudrait-il l'indiquer en haut de votre FAQ, car ce n'est pas évident alors.

    Voilà, si ça peut vous servir ...

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut virgrennes

    Je me permets de te faire remarquer que ton exemple crée la variable $type mais qu'il ne l'utilise pas. Le "switch" ne sert donc à rien. En outre, tu ne protèges pas tes variables dans $_REQUEST, ce qui rend ton script vulnérable à la dangereuse faille d'injection de headers.

    Puisque ton exemple et celui de la FAQ utilisent essentiellement la même technique, je te recommande d'utiliser la version de la FAQ, qui est sécurisée.

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Bonjour,
    pour la variable $type, elle est utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Transfer-Encoding: $type\n");
    mal, je vous l'accorde, mais elle l'est
    la correction devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Transfer-Encoding: ".$type."\n");
    pour la protection des variables, je me renseignerai car je ne vois pas de quoi il en retourne... A moins que vous ayez le temps de m'éclairer...

    Enfin, pour mon post, je crois que comme d'habitude, j'ai voulu trop en dire et n'ai pas été claire du tout, j'ai l'habitude

    J'ai déjà testé la FAQ en mettant le code indiqué dans le mien, mais ça ne fonctionne pas, ou du moins, ça n'ouvre pas la fenêtre de téléchargement, ça affiche simplement le contenu de mon fichier dans ma page.

    Donc, ce que je voulais dire c'est que, si il faut mettre le code de la FAQ dans un autre fichier qu'il faut appeler avec un onclick ou href, ce serait peut-être intéressant de l'expliquer et si il y a une autre manière de l'utiliser, alors peut-être l'indiquer aussi.

    merci de votre réponse en tout cas, je vais regarder à mes variables

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Au temps pour moi, je n'avais pas vu pour la variable. Elle n'est pas mal utilisée, c'est moi qui ne l'avais pas vue.
    Ton commentaire "Surtout ne pas enlever le \n" m'étonne, car habituellement un \n supplémentaire termine le bloc des headers et marque le début du document. Dans ton cas, le document commencerait donc à "Content-Length"

    Peux-tu m'en dire davantage sur ton utilisation ? Quel navigateur as-tu esssayé, dans quelle version ? Peux-tu m'indiquer un lien pour essayer par moi-même, éventuellement en fournissant le code PHP exact ?

  5. #5
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Alors déjà, j'avoue tout, ce code n'est pas complètement de moi, j'en ai découvert le système en 2002, mais je ne me souviens pas de qui en a la paternité (ou maternité, arrêtons un peu ce sexisme )
    Donc pour le \n, je ne me souviens plus, mais j'ai du tester avec et sans à l'époque, car ce commentaire vient de moi, mais pourquoi, je vais reessayer

    Pour ce qui est de son fonctionnement, je vais t'en donner un exemple :

    http://kalifrance.com/download.php

    tu cliques sur n'importe quel produit et tu verras ce qui se passe.

    Pour la méthodologie du truc :

    dans la page simplement appeler le fichier téléchargement dans le a href en passant le nom du fichier et le chemin en paramètre (évidement, pour ce qui est de la protection des données, c'est moyen vu que c'est du GET et non du POST)

    Et ensuite le fichier telechrg.php contient le code cité plus haut puis une structure html-head-body classique vide (je peux te l'envoyer en mail si tu veux)
    donc rien de bien compliqué

    et à quoi il me sert dans mon nouveau site, à permettre le téléchargement d'un fichier csv issu d'une liste de contact récupérée à chaque fois que les gens déposent un message sur mon site.
    le problème, c'est que je voudrais ne pas avoir à créer le fichier csv dans ce fichier de téléchargement, pour qu'il reste le plus généraliste possible et qu'il me serve partout dans mon site et ne soit pas plein de fonctions qui n'ont rien à voir avoir avec son action première.

    donc il me faut
    - cliquer sur export
    - lancer un script qui génère le csv (ou autre)
    - quand le script de génération est finit, lancer ce fichier comme avec un href

    est-ce que tu as toutes les billes?

    en tout cas, c'est gentil d'y réfléchir avec moi, merci

  6. #6
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    effectivement, le \n ne semble rien changer...

    juste comme ça, il a l'air joli ton avatar? c'est toi qui l'a dessiné?

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/12/2011, 17h43
  2. Proposer le téléchargement d'un fichier côté client (GWT)
    Par womannosky dans le forum GWT et Vaadin
    Réponses: 19
    Dernier message: 06/09/2011, 10h24
  3. Proposer le téléchargement d'un fichier
    Par black is beautiful dans le forum ASP
    Réponses: 8
    Dernier message: 10/09/2007, 14h59
  4. Téléchargement d'un fichier CSV
    Par Mateache dans le forum ASP
    Réponses: 6
    Dernier message: 17/08/2006, 15h14
  5. Réponses: 2
    Dernier message: 30/05/2006, 15h07

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