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 :

Télécharger fichier sur PC client


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut Télécharger fichier sur PC client
    Bonjour,

    Dans mon programme je génère un fichier et je souhaiterai que le client puisse le récupérer sur son PC.
    Je ne suis pas très regardant sur la méthode, tant que la finalité est là, donc cela peut aussi bien être de directement sauvegarder mon fichier sur le PC client lors de son enregistrement, ou alors de le copier depuis le répertoire du serveur sur le PC client, que ce soit de manière directe, par exemple dans le dossier "Téléchargement", ou via un explorateur Windows qui demande où enregistrer.

    Le plus simple (à première vue) serait d'enregistrer mon fichier directement sur le PC client, mais comment récupérer la variable d'environnement du dit PC ? Est-ce seulement possible...?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Il est évidemment impossible d'avoir directement accès au pc client.
    Si tu veux transférer un fichier il faut procéder à un téléchargement. Ca peut être fait via le navigateur très simplement avec l'utilisation de readfile() Tu as un exemple dans la doc qui traite de cette problématique

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Merci pour la fonction readfile() qui semble tout à fait convenir à ce que je cherche.

    Néanmoins j'ai essayé mais il ne se passe rien...
    Aussi selon les sites sur lesquels je regarde certain (la plupart) ajoute "echo" devant readfile(), mais pas dans l'exemple de la doc...
    Au final j'ai testé les 2 mais sans succès.

    Extrait de mon 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
    <input type="button" name="myButton" value="Download" onclick="Download()">
     
    <script>    
    function Download()
    {
       <?php
     
            [... construction du fichier ...]
     
       $writer->save('myFile.xlsx'); // Sauvegarde du fichier sur le serveur
     
       readfile('myFile.xlsx');
       ?>
    }
    </script>
    J'ai bien l'enregistrement de mon fichier sur le serveur mais ensuite rien ne se passe...

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Si tu ne met pas les entêtes nécessaire (comme dans l'exemple de la doc) il ne se passe évidemment ri n , le navigateur ne sachant pas comment gérer ce que tu essais de lui envoyer

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Si au moins il pouvait m'envoyer un petit message d'erreur

    Je vois, du coup j'ai copié les lignes de header comme l'exemple de la doc, sauf que moi ça ne m'ouvre pas une pop-up pour me demander où le télécharger.
    Pire, quand j'essaye d'ouvrir la page où si situe mon bouton qui doit déclencher mon script, la page ne s'ouvre même pas et l'ensemble de mon script (incluant le génération du fichier) est éxécuté...

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Montre ton code complet qui ne marche pas.

    C'est normal que le code soit executé quand tu arrives sur la page. Si tu veux que le téléchargement se déclenche sur un l'appui d'un bouton, il faut appeler le script via se bouton et pas y accéder directement

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    C'est ce que je fais justement, c'est pour ça que je ne comprends pas... Et cela fonctionne bien sans le readfile (Mon fichier n'est généré et enregistré sur le serveur que si j'appuie sur le bouton).
    J'avais déjà écrit le code précedemment, mais voila ce que j'ai maintenant avec les header en plus.
    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
    <input type="button" name="myButton" value="Download" onclick="Download()">
     
    <script>    
    function Download()
    {
       <?php
       $file = 'myFile.xlsx'
     
            [... construction du fichier ...]
     
       $writer->save($file); // Sauvegarde du fichier sur le serveur
     
       if (file_exists($file)) 
       {
             header('Content-Description: File Transfer');
             header('Content-Type: application/octet-stream');
             header('Content-Disposition: attachment; filename="'.basename($file).'"');
             header('Expires: 0');
             header('Cache-Control: must-revalidate');
             header('Pragma: public');
             header('Content-Length: '.filesize($file));
             readfile($file);
       }
       ?>
    }
    </script>
    EDIT>> Après vérification, effectivemment même sans le readfile mon fichier est ecrit au chargement de la page sans que j'appuie sur le bouton...

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Maintenant j'ai changé ma méthode d'approche afin d'éviter les problèmes liés au bouton.

    J'ai donc une page php servant uniquement de script pour générer mon fichier et le télécharger.

    Cela fonctionne bien, sauf que le fichier une fois téléchargé est corrompu et un message d'erreur me disant qu'il nécessite d'être réparé s'affiche.
    Sur Excel il arrive quand même à me l'ouvrir (mais bon c'est moche d'avoir à réparer d'abord), et sur Office365 online il ne s'ouvre meme pas...
    Je soupsonne une mauvaise configuration des headers, mais je sais pas...

    Mon code actuel:
    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
     
    $file = 'myFile.xlsx'
     
         [... construction du fichier ...]
     
    $writer->save($file); // Sauvegarde du fichier sur le serveur
     
    if (file_exists($file)) 
    {
         header('Content-Description: File Transfer');
         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // Content-Type pour fichier xslx
         header('Content-Disposition: attachment; filename="'.basename($file).'"');
         header('Expires: 0');
         header('Pragma: public');
         header('Content-Length: '.filesize($file));
         ob_clean(); // sans cette ligne le fichier n'est pas du tout ouvrable
         readfile($file);
    }
    EDIT>> Je viens d'essayer avec un fichier tout basique et je n'ai pas de problème, c'est donc la complexité du fichier qui bloque quelque part... Mais quoi ?

  9. #9
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Citation Envoyé par BartRoX Voir le message
    C'est ce que je fais justement, c'est pour ça que je ne comprends pas... Et cela fonctionne bien sans le readfile (Mon fichier n'est généré et enregistré sur le serveur que si j'appuie sur le bouton).
    J'avais déjà écrit le code précedemment, mais voila ce que j'ai maintenant avec les header en plus.
    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
    <input type="button" name="myButton" value="Download" onclick="Download()">
     
    <script>    
    function Download()
    {
       <?php
       $file = 'myFile.xlsx'
     
            [... construction du fichier ...]
     
       $writer->save($file); // Sauvegarde du fichier sur le serveur
     
       if (file_exists($file)) 
       {
             header('Content-Description: File Transfer');
             header('Content-Type: application/octet-stream');
             header('Content-Disposition: attachment; filename="'.basename($file).'"');
             header('Expires: 0');
             header('Cache-Control: must-revalidate');
             header('Pragma: public');
             header('Content-Length: '.filesize($file));
             readfile($file);
       }
       ?>
    }
    </script>
    EDIT>> Après vérification, effectivemment même sans le readfile mon fichier est ecrit au chargement de la page sans que j'appuie sur le bouton...
    Ce que tu essais de faire ici est strictement impossible. Tu ne peux pas créer une fonction javascript et la remplir avec du PHP. Les deux langages ne sont pas executés au même moment.
    Ce que tu peux faire très simplement en revanche c'est d'appeler le script php qui fait le téléchargement directement depuis un lien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="download.php">
    . Ce qui aura pour effet de générer le fichier et de déclencher le téléchargement.

    Concernant ton fichier corrompu ,comme par l'ouvrir avec un simple éditeur de texte pour vérifier son contenu. Si tu as des erreurs PHP elle peuvent se retrouver dans ton fichier ce qui expliquerait qu'il est corrompu.

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par grunk Voir le message
    Ce que tu peux faire très simplement en revanche c'est d'appeler le script php qui fait le téléchargement directement depuis un lien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="download.php">
    . Ce qui aura pour effet de générer le fichier et de déclencher le téléchargement.
    C'est ce que j'ai fait
    Enfin presque, j'utilise un bouton pour que ce soit joli avec onclick="location.href='download.php'.

    Citation Envoyé par grunk Voir le message
    Concernant ton fichier corrompu, comme par l'ouvrir avec un simple éditeur de texte pour vérifier son contenu. Si tu as des erreurs PHP elle peuvent se retrouver dans ton fichier ce qui expliquerait qu'il est corrompu.
    Ouvrir un xslx avec un éditeur de texte ? Ca me donne juste une floppé de caractères illisibles...
    Mais il est vrai que de base à la fin du fichier j'avais un Warning pour me dire que la ligne header("location:[...].php") que j'avais ajouté à la fin était inutile, je l'ai donc supprimé et effectivement ca fontionne aussi bien. Si c'est de ca que tu parlais en ouvrant le fichier via un editeur de texte, alors je n'ai plus rien maintenant.

    Je viens de découvrir quelque chose d'intéressant: Si j'utilise Firefox je n'ai pas de problème ! C'est avec Edge que ca ne fonctionne pas correctement !
    J'ai essayé de supprimer des headers et ca ne change rien (Donc il devait être inutile a priori). Il me reste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Content-Length: '.filesize($file));
    ob_clean();
    readfile($file);

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    J'ai beau essayer diverse header, d'en enlever, d'en rajouter, d'en modifier, j'en arrive toujours au même...
    Quelqu'un à une idée de pourquoi ça fonctionne bien sur Firefox mais pas sur Edge ?

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    J'ai finalement trouvé !!
    Simplement en ajoutant exit(); après le readfile($file);, mon fichier n'est plus corrompu, même sous Edge.

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

Discussions similaires

  1. télécharger fichier sur le client en GWT
    Par kadje84 dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 21/02/2011, 09h29
  2. Réponses: 7
    Dernier message: 18/01/2007, 16h59
  3. modifié un fichier sur le client
    Par A17594 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 02/01/2007, 18h57
  4. [Upload] Lire un fichier sur le client avant un upload
    Par PedroBD dans le forum Langage
    Réponses: 10
    Dernier message: 26/07/2006, 11h55
  5. Réponses: 4
    Dernier message: 19/07/2006, 13h29

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