Partage
  • Partager sur Facebook
  • Partager sur Twitter

Drag and drop vers ftp

Sujet résolu
    26 avril 2012 à 11:47:13

    Bonjour,
    Je cherche à envoyer un fichier sur un serveur ftp directement après un drag and drop.
    Voici le code html et javacript:
    <div id="holder">
    <progress id="progress" style="display:none"> </progress>
    <p id="infos"></p>
    
    <script>
    holder.ondrop = function (e) {
                this.className = '';
                e.preventDefault();
     
                file = e.dataTransfer.files[0];
     
                var reader = new FileReader();
                reader.onload = function (event) {
     
                    var fileData = event.target.result;
                    
     
                    var formData = new FormData();
                    formData.append("name", file.name);
                    formData.append("size", file.size);
                    formData.append("file", fileData);
     
                    xhr = new XMLHttpRequest();
                    xhr.open("POST", "dlg_new_file_dragdrop.php");
                     progress.style.display='block';
                    xhr.upload.onprogress = function(e) {
                        progress.value = e.loaded;
                        progress.max = e.total;
                    };
                    xhr.send(formData);
     
                    xhr.onreadystatechange=function() {
                        if (xhr.readyState == 4) {
                            if (xhr.status == 200) {
                                var info = document.createElement("div");
                                info.innerHTML = file.name + ": " + file.size + " bytes"
                                    + "<hr />" + xhr.responseText;
                                infos.appendChild(info);
                            }
                        }
                    }
                };
    </script>
    


    Ce code récupère le fichier sous forme d'une variable File javascript et le transmet avec la méthode POST au fichier dlg_new_file_dragdrop.php
    <?
    
    require_once("./_lib/modelixe.h.php");
    require_once("./_lib/html.h.php");
    require_once("./_lib/javascript.h.php");
    require_once("./_lib/file.h.php");
    require_once("./_lib/mysql.h.php");
    require_once("./_lib/other.h.php");
    require_once("./_lib/string.h.php");
    
    session_start();
    
    if (count($_POST) > 0) {
    
        
        $ftp = ftp_connect($_SESSION["pd"]["file"]["ftp_server"]);
        ftp_login($ftp, $_SESSION["pd"]["file"]["ftp_login"], $_SESSION["pd"]["file"]["ftp_password"]);
    
    
        if (!$_POST["name"])
            continue;
    
        $FileName = $_POST["name"];
    
        while ($FileName[0] == " ") {
            $Tmp = substr($FileName, 1);
            $FileName = $Tmp;
        }
        $File = file_formatPath($_SESSION["pd"]["file"]["ftp_path"] . "/" . strtolower(string_removeAccents($FileName)));
    
        ftp_put($ftp,  $File, 'ici je dois mettre ladresse du fichier', FTP_BINARY);
    
        @ftp_quit($ftp);
    }
    ?>
    

    Je récupère donc le fichier dans la variable $_POST et j’essaye de l’uploader mais la fonction ftp_put() en php requiert l’adresse absolue du fichier, et je ne possède que le code binaire du fichier grace à $_POST["file"].
    J’ai donc essayé d’utiliser la fonction php tmpfile() mais j’ai l’impression qu’il est impossible de récupérer le nom du fichier temporaire. Auriez vous une idée de la méthode à utiliser?

    D’avance merci.
    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2012 à 21:47:20

      Tu pourrais créer un fichier PHP à l'aide du contenu binaire, à un emplacement temporaire connu de toi.

      Tu balances sur le FTP grâce au chemin absolu, puis tu supprimes le fichier temporaire créé ?
      • Partager sur Facebook
      • Partager sur Twitter
        27 avril 2012 à 15:52:17

        J'ai réussi d'une autre manière.
        Il suffit de ne pas utiliser le FileReader, et de passer le fichier tel quel au formdata. De cette manière, la page php reçoit le fichier dans $_FILES et on peut faire un traitement classique.

        Le code final:
        holder.ondrop = function (e) {
                    this.className = '';
                    e.preventDefault();
        
                    file = e.dataTransfer.files[0];
         
                    var fileData = event.target.result;
                    var formData = new FormData();
                        
                     
                    formData.append("file", file);
         
                    xhr = new XMLHttpRequest();
                        
                    xhr.open("POST", "dlg_new_file_dragdrop.php");
        
                        
                    progress.style.display='block';
                    xhr.upload.onprogress = function(e) {
                        progress.value = e.loaded;
                        progress.max = e.total;
                    };
                    xhr.send(formData);
         
                    xhr.onreadystatechange=function() {
                        if (xhr.readyState == 4) {
                            if (xhr.status == 200) {
                                progress.style.display='none';
                                location.reload(true);
                            }
                        }
                    }      
                   
                    return false;
                };
        


        et le fichier php:
        require_once("./_lib/modelixe.h.php");
        	require_once("./_lib/html.h.php");
        	require_once("./_lib/javascript.h.php");	
        	require_once("./_lib/file.h.php");
        	require_once("./_lib/mysql.h.php");
        	require_once("./_lib/other.h.php");	
        	require_once("./_lib/string.h.php");		
        		
        	session_start();
               
        	if (count($_FILES)>0)
        	{
                  var_dump($_FILES);   
        		$ftp = ftp_connect($_SESSION["pd"]["file"]["ftp_server"]);
        		ftp_login($ftp, $_SESSION["pd"]["file"]["ftp_login"], $_SESSION["pd"]["file"]["ftp_password"]);
        	
        		for ($i=0; $i<count($_FILES); $i++)
        		{
        			if (!$_FILES['file']["name"])
        				continue;
        
        			$FileName = $_FILES['file']["name"];
        		
        			while ($FileName[0] == " ")
        			{
        				$Tmp = substr($FileName, 1);
        				$FileName = $Tmp;
        			}
                           
        			$File = file_formatPath($_SESSION["pd"]["file"]["ftp_path"]."/".strtolower(string_removeAccents($FileName)));
        			ftp_put($ftp,  $File, $_FILES['file']["tmp_name"], FTP_BINARY);
        
        		}
        				
        		@ftp_quit($ftp);
        		
        	}
        
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2013 à 17:04:51

          Bonjour leduffman .

          Ton script est très intéressant mais je suis particuliérement nul en programmation.

          Pourrait-on obtenir les deux fichiers complets dans un zip afin de les placer sur un serveur ?

          Merci pour ton aide.

          Alex

          • Partager sur Facebook
          • Partager sur Twitter

          Drag and drop vers ftp

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown