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

JavaScript Discussion :

Autoclick suite à formulaire php


Sujet :

JavaScript

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut Autoclick suite à formulaire php
    Bonjour à tous,

    Je ne connais vraiment pas grand chose en javascript, mais j'en aurais besoin je pense pour supporter le scnéario suivant:
    - remplissage d'une formulaire html par un utilisateur
    - lancement d'un script php avec ces données sur le serveur=> output: un pointeur sur le serveur
    - déclanchement automatique du téléchargement du fichier (sans click supplémentaire du user)

    Le Dev est fait pour les 2 premiers points.
    Pour le téléchargement, est-ce que php peut passer à javascript un path qui sera déclanché automatiquement ?
    Comment faire concrètement ?

    Merci pour votre aide !

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 674
    Points : 2 378
    Points
    2 378
    Par défaut
    Bonjour,

    Il est possible de forcer un téléchargement en Javascript via une petite fonction :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function downloadFile(data, name = 'file', type = 'text/plain') {
      const { createElement } = document
      const { URL: { createObjectURL, revokeObjectURL }, setTimeout } = window
     
      const blob = new Blob([data], { type })
      const url = createObjectURL(blob)
     
      const anchor = createElement('a')
      anchor.setAttribute('href', url)
      anchor.setAttribute('download', name)
      anchor.click()
     
      setTimeout(() => { revokeObjectURL(url) }, 100)
    }
    Source : https://mindsers.blog/fr/post/telech...er-javascript/

    Cependant, il faut tenir compte du fait qu'il soit tout à fait possible que le navigateur block le script car il peut le voir comme malhonnête !

    A voir donc si c'est vraiment comme ça que vous souhaitez faire. Sinon il est possible également de forcer un téléchargement via PHP mais ça veut dire qu'il faut faire un redirect d'URL mais en réalité, c'est souvent comme ça que ça se passe.
    Par exemple, les compteurs de téléchargements fonctionnent comme ça. Au lieu de rediriger directement vers le fichier final, le lien dirige vers une page qui va faire "+1" sur l'ID du fichier et il va ensuite rediriger vers une page qui va forcer le téléchargement

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    mars 2002
    Messages
    38 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 38 956
    Points : 65 335
    Points
    65 335
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas l'intéret de revenir sur le client pour lancer le téléchargement.
    La page de traitement du formulaire peut directement faire un force download en php ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

    réalisations :www.oxygen-translations.fr|www.saftair.fr| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    C'est ce que j'essaye de faire, mais sans y parvenir.
    J'ai le fichier server.php qui fait le traitement de fichier et ensuite je voudrais appeller download.php mais sans y parvenir (j'ai fait diverses tentatives, j'ai soit des erreurs, soit le téléchargement ne s'effectue pas).

    Ci-dessous mon code download.php:

    Code php : 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
    <?php 
     
    if (!empty($_GET['Finalzip'])) {
    	$filepath = $_GET['Finalzip'];
    	$Finalzip = basename($filepath);
    	$encoded_Finalzip = rawurlencode($Finalzip);
     
    if ($send_header) {
    	header("Content-Disposition: attachment; Finalzip=\"{$encoded_Finalzip}\"");
    	header("Content-Type: {zip}");
    	header("Content-Length: ".filesize($filepath));
    	header('Cache-Control: no-store');
    	readfile($filepath);
    }
     
    }else{
     
    	http_response_code(500);
    }
     
    ?>

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    mars 2002
    Messages
    38 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 38 956
    Points : 65 335
    Points
    65 335
    Billets dans le blog
    1
    Par défaut
    A priori tu tentes de retourner un zip, mais tu retournes le contenu pas le chemin vers le zip ...
    Comme c'est un zip et qu'un lien vers le zip force le navigateur à la télécharger il faut faire un header location vers le path de ton fichier zip


    sinon il faut renvoyer un header de force download
    https://php.developpez.com/faq/?page..._forcedownload
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

    réalisations :www.oxygen-translations.fr|www.saftair.fr| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

  6. #6
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 674
    Points : 2 378
    Points
    2 378
    Par défaut
    Bonjour,

    Il y a pas mal de choses qui ne vont pas dans ce code.

    1. D'où vient la condition $send_header ? Dans le code présenté, elle n'est jamais vraie donc les instructions de ce block ne sont jamais exécutées.

    2. Finalzip=\"{$encoded_Finalzip}\"" non ce n'est pas Finalzip= mais filename=.

    3. header("Content-Type: {zip}"); le type de contenu n'est pas correct, il s'agit plutôt de : header("Content-Type: application/zip");.

    4. readfile($filepath); d'après ce que vous avez écrit, à moins que vous ne passiez le chemin complet d'accès à votre fichier dans l'URL (et ça serait un énorme trou de sécurité), la variable $filepath ne contient que le nom du fichier ou une référence (style un ID). Au lieu d'écrire $filepath = $_GET['Finalzip']; vous devriez écrire le chemin complet d'accès à votre fichier : $filepath = dirname(__FILE__).'/../my-files/'.$_GET['Finalzip']; (si par exemple, les fichiers sont dans un sous-dossier "my-files" situé dans le parent du fichier PHP où est écrit le code). Vous pouvez aussi écrire "en dur" le chemin d'accès mais c'est moins souple : $filepath = '/home/my-domain/uploads/my-files/'.$_GET['Finalzip'];.

    5. D'un point de vue sécurité, il faudrait aussi vérifier que le fichier (représenté par $_GET['Finalzip']) fait bien partie d'un fichier autorisé a être téléchargé


    Voici un bout de code qui fait un peu tout, tout seul.
    Il détecte le MIME Type du fichier et son encodage
    Le truc le plus important est de fournir le chemin d'accès COMPLET au fichier
    Code php : 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
    if (!empty($_GET['Finalzip'])) {
        $filepath = '/home/my-domain/uploads/my-files/' . $_GET['Finalzip'];
     
        if (file_exists($filepath)) {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            header('Content-Type: ' . finfo_file($finfo, $filepath));
     
            $finfo = finfo_open(FILEINFO_MIME_ENCODING);
            header('Content-Transfer-Encoding: ' . finfo_file($finfo, $filepath));
     
            header('Content-disposition: attachment; filename="' . basename($filepath) . '"');
            readfile($filepath);
            exit;
        } else {
            echo PHP_EOL . '<pre>Le fichier n\'existe pas : ' . print_r($filepath, true) . '</pre>' . PHP_EOL;
        }
    }

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Hello SpaceFrog,

    Comment faire pour que mon fichier server.php déclanche download.php ?

    Avec un include ?
    et le path vers le zip, comment le passer ? include download.php($Finalzip); ?

    Thanks.

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    mars 2002
    Messages
    38 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 38 956
    Points : 65 335
    Points
    65 335
    Billets dans le blog
    1
    Par défaut
    il faut faire un header location vers le path de ton fichier zip
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

    réalisations :www.oxygen-translations.fr|www.saftair.fr| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
    Humour

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Hello all,

    Désolé pour le retour tardif, j'ai eu assez peu de temps cette semaine pour tester.
    N'ayant pas réussi à converger malgré vous imput, j'ai simplifié à l'extrême mon code pour illustrer le principe et ce qui ne fonctionne pas.

    Le code tourne mais:
    - le echo ne s'affiche pas
    - ça déclenche une fenetre de download qui ne propose pas le download du fichier.zip, mais de ...formulaire-mini.php

    Merci encore pour votre aide précieuse !

    formulaire-mini.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <html>
     
    <form action=formulaire-mini.php method="post">
     <p>Code client : <input type="text" value="Client A" name="codeclient" /></p>
     <p><input type="submit" value="OK"></p>
    </form>
     
    <?php
     
    function GetFile($codeclient){
            $Namezip="C:/Users/moi/Desktop/Test/".$codeclient."fichier.zip";
            echo $Namezip;
            //echo "<br>";
                    
            include ('download.php');
            download($Namezip);
    }
     
    if (empty ($_POST['codeclient'])) {
    //echo "No customer code selected";
    }
    else {
    GetFile($_POST['codeclient']);
    }
    ?>
     
    </html>

    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
    19
    20
    21
    22
    23
     
     
    <?php 
     
    function download($Namezip){
     
    if (!empty($Namezip)) {
            $filepath = $Namezip;
            $Finalzip = basename($filepath);
            $encoded_Finalzip = rawurlencode($Finalzip);
     
            header("Content-Disposition: attachment; Finalzip=\"{$encoded_Finalzip}\"");
            header("Content-Type: {zip}");
            header("Content-Length: ".filesize($filepath));
            header('Cache-Control: no-store');
            readfile($filepath);
    }
    else{
            http_response_code(500);
    }
     
    }
    ?>

  10. #10
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 674
    Points : 2 378
    Points
    2 378
    Par défaut
    Bonjour,

    Voir les points 2, 3, 4 et 5 de mon message.

    Sinon, faire un header location vers le fichier comme le proposait @SpaceFrog
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    function download($Namezip) {
        $filepath = "https://www.domain.td/chemin/complet/vers/le/fichier/" . $Namezip;
        header("Location: " . $filepath);
        exit;
    }

    En général, on va utiliser le "force download" pour les fichiers qui vont tenter s'ouvrir dans le navigateur sans téléchargement (comme par exemple un fichier .txt, .pdf ou encore une image) mais une archive .zip va de toute façon déclencher un téléchargement.

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Hi darkstar123456,

    Merci, merci, merci, ça fonctionne parfaitement, c'est top ! you rock !

    Nom : Screen Shot 09-27-21 at 09.11 AM.JPG
Affichages : 55
Taille : 32,1 Ko

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Hello,

    Je reviens sur ce sujet car tout fonctionne parfaitement en local (Wamp) et sur le server de mon entreprise.
    Par contre le but final est d'intégrer ce dev dans un widget.
    Le problème est que dans ce cas là, le download.php ne se déclenche pas.

    Des tests que j'ai effectué, c'est lié au fait qu'il faudrait que le téléchargement download.php se déclenche dans un nouvelle tab du navigateur.

    Comment faudrait-il faire ?
    Il faut ajouter du javascript à la fin de formulaire.php pour ouvrir automatiquement une tab et y appeler download.php ?

    Je nage un peu là....

    Merci pour vos lumières !

  13. #13
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 674
    Points : 2 378
    Points
    2 378
    Par défaut
    Bonjour,

    J'imagine qu'on arrive sur le lien final à partir d'un click
    Donc dans le lien sur lequel on click, il suffit d'ajouter target="_blank" pour forcer l'ouverture d'un lien dans un nouvel onglet

    (Vu qu'il s'agit d'un téléchargement, l'onglet devrait -en théorie- se fermer automatiquement dès le début du téléchargement)

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

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : décembre 2019
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Hello @darkstar123456

    En fait je n'ai pas de lien final.
    Le seul click se fait au niveau du bouton de submit du formulaire, qui déclenche le code server, qui lui-même appelle download.php

    Je pense que ce qu'il faudrait, c'est click automatique en javascript vers le fichier server avec target=_blank, une fois le traitement server terminé.

    Mais je ne sais pas comment mettre en place ce type d'event en js à la fin de mon formulaire. Ni comment comment passer ce lien vers le fichier sur le server en variable au js depuis le php (car le path du fichier est une variable server php, pas cliente).

    Je remets le code ultra simplifié pour illustrer l'état de l'art actuel.

    Toutes suggestions sont les bienvenues.

    FORMULAIRE + TRAITEMENT SERVER

    Code html : 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
    <html>
     
    <form action=formulaire-mini.php method="post">
     <p>Code client : <input type="text" value="Client A" name="codeclient" /></p>
     <p><input type="submit" value="OK"></p>
    </form>
     
    <?php
     
    function GetFile($codeclient){
            $Namezip="C:/Users/moi/Desktop/Test/".$codeclient."fichier.zip";
            //echo $Namezip;
            //echo "<br>";
                    
            include ('download.php');
            download($Namezip);
    }
     
    if (empty ($_POST['codeclient'])) {
    //echo "No customer code selected";
    }
    else {
    GetFile($_POST['codeclient']);
    }
    ?>
     
    </html>

    FORCE DOWNLOAD (mais dans la même fenêtre, ce qui pose problème dans un widget)
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php 
     
    function download($Namezip){
     
     header("Location: " . $Namezip);
        exit;
    ?>

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

Discussions similaires

  1. [Artichow] Image PNG en caractères ASCII suite à formulaire en PHP
    Par x86master dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/03/2011, 11h06
  2. [MySQL] Formulaire PHP ->MySQL
    Par shub dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 09/02/2010, 22h42
  3. Nom d'un Formulaire Php
    Par etiennegaloup dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2005, 21h55
  4. Formulaire PHP+ envoi de fichier joint
    Par GraphicProvider dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2005, 18h12
  5. [MySQL] Formulaire php + bdd = perte des sauts de ligne html ?
    Par sunshine33 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/10/2005, 11h19

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