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 :

Download fichier sur PC user


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Décembre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Décembre 2019
    Messages : 67
    Points : 54
    Points
    54
    Par défaut Download fichier sur PC user
    Bonjour à tous,

    Je fais du traitement server de fichiers que je zippe et que je souhaite ensuite permettre à l'utilisateur de récupérer sur son PC.

    Je me suis inspiré de bonne pratiques trouvées dans d'autres post, mais mon traitement s'arrete à partir du moment où je dé-commente la ligne: header("Content-disposition: attachment; filename=$filepath");

    Je ne comprends pas pourquoi.

    Auriez-vous une idée ?

    Merci pour votre aide.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    <html>
    HELLO
    <br>
    TELECHARGEMENT DU FICHIER
    <br>
     
     
    <?php
     
     
     
    $filepath = 'clients\\fichier.zip';
    $filename = basename ($filepath);
     
    if (file_exists($filepath)) {
    	echo "Download OK";
    	echo "<br>";
    }
    else {
    	echo "Download KO";
    	echo "<br>";
    }
     
     switch(strrchr($filename, ".")) {
     
    case ".gz": $type = "application/x-gzip"; break;
    case ".tgz": $type = "application/x-gzip"; break;
    case ".zip": $type = "application/zip"; echo "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 ".xml": $type = "text/xml"; break;
    default: $type = "application/octet-stream"; break;
     
    }
     
     
    header("Content-disposition: attachment; filename=$filepath");
    /*
    header("Content-Type: application/force-download");
    header("Content-Transfer-Encoding: $type\n");
    header("Content-Length: ".filesize($filepath));
    header("Pragma: no-cache");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
    header("Expires: 0");
     
    readfile($filepath);
    */
     
     
    ?>
    </html>

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    C'est normal, la requête HTTP résultante contient un mix HTML/ZIP.
    De plus, tu utilises header(), qui modifies les en-têtes HTTP, alors que la réponse a déjà été envoyée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <html><!-- Provoque l'envoi de la réponse HTTP -->
    ...
    <?php 
    header(...); // Tentative de modifs des en-têtes HTTP alors que déjà expédiées
    readfile($filepath); // Envoi du fichier => Mix invalide
    Il faut faire, dans le fichier de la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="download.php">Télécharger</a>
    Et dans download.php :

    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
    <?php
     
    // download.php ne doit renvoyer que le contenu du fichier, rien d'autre
     
    $filepath = 'clients\fichier.zip';
    $filename = basename($filepath);
    $type = mime_content_type($filename); // https://www.php.net/manual/fr/function.mime-content-type
    $encoded_filename = rawurlencode($filename);
     
    header("Content-Disposition: attachment; filename=\"{$encoded_filename}\"");
    header("Content-Type: {$type}");
    // Nope header("Content-Transfer-Encoding: $type\n");
    header("Content-Length: ".filesize($filepath));
    header("Pragma: no-cache");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
    header("Expires: 0");
     
    readfile($filepath);

  3. #3
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Décembre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Décembre 2019
    Messages : 67
    Points : 54
    Points
    54
    Par défaut
    Merci Seb por ton aide détaillée !

    Ca semble fonctionner en local sur mon PC, a ceci pret que si on lance plusieurs fois la page, il lance le download de ce qu'il a en cache.
    Y a t'il moyen de cleaner le cache ?

    Par contre sur server, la requete plante avec un code 500.
    De ce que je comprends, ça semble lié a strict-origin-when-cross-origin (mais pas sur).
    Je décrouvre le sujet, est-ce bypassable ?

    Merci encore.

    Nom : Screen Shot 08-05-21 at 02.20 AM.JPG
Affichages : 189
Taille : 7,2 KoNom : Screen Shot 08-05-21 at 02.21 AM.JPG
Affichages : 188
Taille : 7,4 KoNom : Screen Shot 08-05-21 at 02.20 AM.JPG
Affichages : 189
Taille : 7,2 KoNom : Screen Shot 08-05-21 at 02.21 AM.JPG
Affichages : 188
Taille : 7,4 Ko

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Bibou64 Voir le message
    Ca semble fonctionner en local sur mon PC, a ceci pret que si on lance plusieurs fois la page, il lance le download de ce qu'il a en cache.
    Y a t'il moyen de cleaner le cache ?
    Remplace ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    header("Pragma: no-cache");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
    header("Expires: 0");
    Par cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Cache-Control: no-store');
    Par contre sur server, la requete plante avec un code 500.
    De ce que je comprends, ça semble lié a strict-origin-when-cross-origin (mais pas sur).
    Je décrouvre le sujet, est-ce bypassable ?
    Comment t'y prends-tu pour appeler download.php ? Un simple lien ? Du JavaScript ?
    La page affichée et le fichier download.php ne sont pas sur le même domaine ?
    Le paramétrage du CORS est principalement du côté serveur partageant la ressource (en-tête Access-Control-Allow-Origin)
    https://developer.mozilla.org/fr/docs/Web/HTTP/CORS

  5. #5
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Décembre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Décembre 2019
    Messages : 67
    Points : 54
    Points
    54
    Par défaut
    Hello Sébastien,

    J'ai analysé par dichotomie et il semble que le problème que j'ai depuis le départ est dû au fait que mime_content_type n'est pas reconnu par le server.
    J'ai demandé à l'admin de regarder, je pense à un problème d'install ou de version de php.
    Qu'en penses-tu ?

    derniers points:
    - sais-tu s'il est possible de laisser au User le choix du directory de download ? Avec le code actuel ça va dans le directory par défaut du browser
    - sais-tu s'il est possible de détecter un event de fin de téléchargement ? car je souhaiterai supprimer le fichier zip source sur le server, juste après le download

    Merci encore pour ton aide !


    Code modifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //$type = mime_content_type($filename); // FONCTION KO SUR SERVER
    //echo $type;
     
    $encoded_filename = rawurlencode($filename);
     
    header("Content-Disposition: attachment; filename=\"{$encoded_filename}\"");
    //header("Content-Type: {$type}");
    header("Content-Type: {zip}"); // bypass en forçant à zip, ok dans mon cas

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Bibou64 Voir le message
    J'ai analysé par dichotomie et il semble que le problème que j'ai depuis le départ est dû au fait que mime_content_type n'est pas reconnu par le server.
    J'ai demandé à l'admin de regarder, je pense à un problème d'install ou de version de php.
    Qu'en penses-tu ?
    Je n'ai pas assez d'éléments.

    - sais-tu s'il est possible de laisser au User le choix du directory de download ? Avec le code actuel ça va dans le directory par défaut du browser
    L'utilisateur choisit où il télécharge. Si le choix ne lui est pas proposé c'est qu'il a défini dans son navigateur un dossier de destination à utiliser automatiquement.

    - sais-tu s'il est possible de détecter un event de fin de téléchargement ? car je souhaiterai supprimer le fichier zip source sur le server, juste après le download
    A priori après le readfile() tu peux supprimer le fichier. Mais ça me semble une mauvaise idée car même si tu as lu/envoyé le fichier, rien n'assure qu'il a bien été réceptionné et enregistré par l'utilisateur.
    Je ne connais pas ta situation et ton besoin précis, mais perso je laisserais les fichiers et supprimerais de temps en temps les plus vieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: {zip}"); // bypass en forçant à zip, ok dans mon cas
    Pas bon ça, "{zip}" n'est pas un type MIME valide.

  7. #7
    Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Décembre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Décembre 2019
    Messages : 67
    Points : 54
    Points
    54
    Par défaut
    Merci Seb pour tes précieux conseils, mon dev fonctionne correctement désormais, c'est top !
    thanks

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

Discussions similaires

  1. Suppression fichier sur le serveur après download
    Par mfrai02 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/02/2010, 16h24
  2. [FTP]Download un fichier sur le serveur
    Par bizet dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/08/2007, 16h13
  3. Réponses: 2
    Dernier message: 18/04/2007, 16h44
  4. [FTP] download de fichiers sur serveur AIX
    Par han39 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2006, 17h44
  5. [VB.NET] Download de fichiers sur un serveur...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 19/05/2004, 11h25

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