Download fichier(s) url sur localhost en mode caché

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - Modifié le 11 nov. 2017 à 19:37
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 15 nov. 2017 à 17:36
Bonjour le forum,

Pour bien commencer, j'espère ne pas mettre trompé de forum (Javascript ou php).
Merci d'avance à un bienveillant modérateur de déplacer ce post dans le forum adéquat si c'est le cas !!!

Préambule:
Pour m'initier au Javascript et au PHP (cause job), j'essaie de transformer une de mes applis VB.Net (Connexion Internet sur host et download de fichiers sur mon localhost).

Mon nouveau script actuel en test (Application.php):
<!DOCTYPE html>
<html>
    <head>
  <title> Test jean-marc </title>
        <meta charset="utf-8" />
 
  <script language="javascript" type="text/javascript">
             //--- variables globales ---
             var myselect=null; // objet global
    var url = "http://console-monhostdistant/export/clientValidation.php?cli=";
    var pathoutfile = "http://localhost/test/ID-Mon/Fichiers%20Client/";
   
            //--- fonction appelée au chargement de la page
             window.onload = function () {       
    myselect=document.getElementById("ListeClient")
    
   // for (var i=0; i<myselect.options.length; i++){
   //  print("Option index "+i + ":" + myselect.options[i].text + " (" + myselect.options[i].value + ")") 
   // }                 

    // fonction de gestion d'un changement select 
    myselect.onchange=function () {
     var index=this.selectedIndex;
     var str=this.options[index].text;
     if (this.selectedIndex > 1) {
      document.body.appendChild(document.createElement("br"));
      var res = str.split(" : ");
      print ("Votre sélection -> Contrat " + res[0]); 
      print ("Téléchargement du fichier en cours");
      
      //downloadURI(url  + res[0], pathoutfile);
      //download (url, pathoutfile);
      //window.location.href = url + res[0];

      
     } else if (str = "Tous les contrats") {
       if (this.selectedIndex == 1) {
       document.body.appendChild(document.createElement("br"));
       print ("Votre sélection -> " + str); 
       var len = document.getElementById("ListeClient").length;
       print ("Téléchargement des " + (len-2) + " fichiers en cours");
      }
     }        
    }
   }

            //---- fonctions ----
            function print(textIn) { 
                var txt=textIn;
                var newtext = document.createTextNode(txt);
                document.body.appendChild(newtext);   
                document.body.appendChild(document.createElement("br"));
                document.body.appendChild(newtext);  
            } // fin print  
   
     function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
  } // fin downloadURI     

     function download(url, outfile) {
  var txturl="check url -> " + url;
    var newtexturl = document.createTextNode(txturl);
    document.body.appendChild(newtexturl); 
    document.body.appendChild(document.createElement("br"));
                document.body.appendChild(newtexturl);
    
    var txtoutfile="check outfile -> " + outfile;
    var newtextoutfile = document.createTextNode(txtoutfile);
    document.body.appendChild(newtextoutfile); 
    document.body.appendChild(document.createElement("br"));
                document.body.appendChild(newtextoutfile);
    
   } // fin download
   
  </script>
    </head>

    <!-- Debut Corps de page  -->
    <body >
  <H4>Download fichier ID-Mon regroupant les fiches d'un contrat</H4></title>
  <?php
   session_start ();
   $login = $_POST['login'];
   $pwd = $_POST['pwd'];
   $url  = "http://$login:$pwd@console-monhostdistant/id/EquipementListe.do";
   
   // Récupération de la page Web dans un tableau
   if (! $lines = file($url)){ 
    $_SESSION['error'] = "Login ou mot de passe incorrect";
    header('Location: ' . $_SERVER['HTTP_REFERER']); 
   }

   $results = array();
   $search = "document.location='/id/EquipementListe.do?cli=";
 
   // parcours des données
   foreach($lines as $key => $val) {
    // stockage des résultats positifs
    if (strpos($val,$search)!==false){
     $newstring = substr($val, -8,3);
     
     // print_r($val . '</br>');
     // print_r($newstring . '</br>');
     // print_r($lines[$key+1] . '</br>');
     // print_r('</br>');
     
     switch ($newstring) {
      // Omission de certains contrats
      case 'XXX': break; case 'AS0': break; case 'AS2': break; case 'AS3': break;
      case 'AS4': break; case 'ASS': break; case 'CPS': break; case 'CRZ': break;
      default:
      // On récupère le contenu de la ligne +1 du tableau
      $results[] = $lines[$key+1] . '</br>';
     }
    }
   }
 
   // Suppression des doublons et tri alphabétique
   $array_client = array_unique ($results);
   sort($array_client);
   // print_r($array_client); 
  ?>

  <!-- Création de la liste déroulante  -->
        <select id="ListeClient">
  <?php
   // Initialisation du header   
   echo "\t",'<option value="', "Choix",'"', "label=","Choix", '>', "Choix" ,'</option>',"\n";
   echo "\t",'<option value="', "Tous les contrats", '"', "label=", "Tous les contrats", '>', "Tous les contrats" ,'</option>',"\n";
    
   // Parcours du tableau des clients
   for ($numero = 0; $numero < count($array_client); $numero++){
    echo "\t",'<option value="', $array_client[$numero] ,'"', "label=",$array_client[$numero], $array_client[$numero] ,'</option>',"\n";
   }
  ?> 
  </select>
    </body>
</html>


Prévisualisation du post, l'indentation n'est pas terrible !!!

OK:
Connexion à mon url, création de la liste déroulante (ex ListBox) et click sur celle-ci.

NOK:
Avec la fonction "downloadURI", le download m'ouvre la fenêtre de téléchargement du fichier avec enregistrement dans mon path local "Download". Ce que je ne souhaite pas car si selection de "Tous les contrats", cela devra enchainer sur une centaine de download.

Est-il possible de faire ce(s) download(s) en mode hidden en précisant mon répertoire de destination (var pathoutfile) ???

Merci d'avance de vos réponses et de votre indulgence pour ce premier script en Javascript/Php.

jean-marc

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).

Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
Jordane45

Merci Jordane de ton intervention. Bonne soirée.

3 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
11 nov. 2017 à 19:43
Bonjour,

je n'ai pas regardé ton code en détail ...

Mais déjà, je t'invite à lire ceci : http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code


ensuite, concernant le téléchargement de fichiers
Si tu veux juste récupérer les fichiers et les mettre sur le serveur... dans ce cas... nul besoin de passer par du JS.
Je pense plutôt que tu PHP serait plus adapter... regarde ce que permettent les fonctions http://php.net/manual/fr/function.file-get-contents.php et éventuellement http://php.net/manual/fr/function.file-put-contents.php

Si ton but est plutôt que les fichiers se téléchargent sur le pc de l'utilisateur ... dans ce cas il serait pas mal de les récupérer sur le serveur, de générer un zip avec le (ou les )fichier(s) à récupérer puis à lancer l'upload. (là encore ça se fait en PHP .. aussi bien pour la création du zip que pour l'ouverture de la fenêtre de download.

Pour créer un zip, par exemple:
<?php

    <?php
$zipFileName = "monfichier.zip";
$zip = new ZipArchive(); 

if($zip->open($zipFileName, ZipArchive::CREATE)){
    
    // Ajout d’un fichier dans le zip
    $zip->addFile('Fichier.txt');

    //Fermeture de l'archive.
    $zip->close();

}else{
  echo 'Impossible d'ouvrir "Zip.zip<br/>';
}



Pour le téléchargement.. un truc du genre
<?php
$file = "http://example.com/tonFichier.truc"; 

header("Content-Description: File Transfer"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename='" . basename($file) . "'"); 

readfile ($file);
exit(); 
?>





0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
Modifié le 11 nov. 2017 à 19:59
Bonsoir Jordane,

Merci de tes conseils.

Je n'ai pas les droits pour créer un zip sur le serveur distant.
Via url je peux télécharger x fichiers.

En VB.Net, je faisais:
    Async Function DownloadFile(trigramme As String) As Task
        Dim file As String = pathroot & "Client-" & trigramme & ".xlsx"
        If System.IO.File.Exists(file) = True Then
            System.IO.File.Delete(file)
        End If
        Await WC.DownloadFileTaskAsync(New Uri(URL_FileName & trigramme), file)
    End Function


Bonne soirée,

jean-marc
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
12 nov. 2017 à 16:18
Bonjour le forum,

La commande
file_put_contents("./Fichiers Client/YYY-Production.xlsx", fopen("http://console-monhostdistant/export/clientValidation.php?cli=YYY", 'r'));
transfert, sans ouvrir de fenêtre de confirmation, le fichier YYY-Production.xlsx du server distant vers mon localhost mais dès l'ouverture du formulaire.
Je ne sais pas comment envoyer cette commande quand je suis à l'étape du select de la liste déroulante et indiquer en paramètre le trigramme du contrat à la place YYY.



jean-marc
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
12 nov. 2017 à 17:21
Avec de la concaténation sûrement...
$fichier = "./Fichiers Client/".$YYY."-Production.xlsx";
file_put_contents($fichier, fopen("http://console-monhostdistant/export/clientValidation.php?cli=YYY", 'r'));

$YYY étant une variable contenant la valeur à utiliser
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
12 nov. 2017 à 17:52
Bonjour Jordane,

Merci du temps consacré à me lire et à me répondre.

Je me suis mal exprimé. Je ne sais pas comment déclencher ce transfert.
A l'ouverture de mon formulaire:
- je télécharge un fichier qui me permet de créer une liste déroulante dynamique;
- c'est au click sur l'un des items de cette listbox que je souhaite déclencher mon (ou mes) transfert(s).
				// fonction de gestion d'un changement select 
				myselect.onchange=function () {
					var index=this.selectedIndex;
					var str=this.options[index].text;
					if (this.selectedIndex > 1) {
						document.body.appendChild(document.createElement("br"));
						var res = str.split(" : ");
						print ("Votre sélection -> Contrat " + res[0]); 
						print ("Téléchargement du fichier " + res[0] + "-Production.xlsx en cours");
						
						// ICI download du fichier du contrat sélectionné
						// download (url  + res[0], pathoutfile + res[0] + "-Production.xlsx");
						
					} else if (str = "Tous les contrats") {
							if (this.selectedIndex == 1) {
								var contrats = document.getElementById("ListeClient");
								var len = document.getElementById("ListeClient").length;
								document.body.appendChild(document.createElement("br"));
								print ("Votre sélection -> " + str); 							
								print ("Téléchargement des " + (len-2) + " fichiers en cours");
								
								var counter = 0;
								for (let item of contrats) {
									if (counter > 1) {
									var res = item.value.split(" : ");
									print (res[0]);
									
							// ICI download du fichier du contrat "item"
							// download (url  + res[0], pathoutfile + res[0] + "-Production.xlsx");
						
									}
								counter++;
								} // fin for
							} //  fin if
					} //  fin if ... else								
				} // fin myselect.onchange=function ()
			} // fin window.onload = function ()


Je ne sais pas comment déclarer ce transfert dans le body.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
12 nov. 2017 à 18:07
Là tu as deux choix.
Soit tu veux bien que ta page se rafraichisse... et dans ce cas là tu peux simplement mettre ton select dans une balise FORM et déclencher le submit lors du choix (tu peux le faire en javascript).

Soit tu ne veux pas de refresh... et dans ce cas là il te faudra utiliser de l'ajax (le plus simple étant via jquery). (déclenché aussi via le onchange de ton select)

Pour l'ajax, voici des exemples : http://codes-sources.commentcamarche.net/source/102253-exemple-ajax-en-jquery
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
12 nov. 2017 à 18:12
Merci Jordane de tes conseils.
Je vais m'orienter vers ta 1ère proposition.

Bonne soirée,
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
15 nov. 2017 à 17:36
Bonjour le forum,

Finalement, j'ai opté pour la 2ème proposition (avec ajax et jquery) de Jordane, que je remercie pour ces précieux conseils.
0
Rejoignez-nous