Download fichier(s) url sur localhost en mode caché [Résolu]

Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 11 nov. 2017 à 19:05 - Dernière réponse :
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
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.
Afficher la suite 

Votre réponse

8 réponses

Messages postés
23256
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
- 11 nov. 2017 à 19:43
0
Merci
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(); 
?>





Commenter la réponse de jordane45
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- Modifié par cs_JMO le 11/11/2017 à 19:59
0
Merci
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
Commenter la réponse de cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 12 nov. 2017 à 16:18
0
Merci
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
Messages postés
23256
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
- 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
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
23256
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
- 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.
Messages postés
23256
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
>
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
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
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
23256
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2018
- 12 nov. 2017 à 18:12
Merci Jordane de tes conseils.
Je vais m'orienter vers ta 1ère proposition.

Bonne soirée,
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
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.
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.