2016-06-09 5 views
0

Я пытаюсь загрузить удаленное местоположение на FTP-сервере в свой локальный каталог. Я использовал модуль jsftp (https://github.com/sergi/jsftp) для этого, но у меня проблема.NodeJS загружает удаленный доступ к локальному FTP

В основном я пытаюсь рекурсивно загрузить всю удаленную папку, включая все подпапки и т. Д. Я сам пытался понять это, но пока не повезло.

до сих пор я пытался это:

var worker = { 
    ftp: null, 
    init: function() { 
     this.ftp = new JSFtp({ 
      host: "localhost", 
      port: 21, 
      user: "username", 
      pass: "password" 
     }); 
     this.ftp.auth("username", "password", function (result) { 
      if (typeof result !== "undefined") { 
       console.log("Something went wrong"); 
      } 

      this.handleData(); 
     }.bind(this)); 
    }, 
    handleData: function() { 
     recursive_get_files(this, "/"); 
    } 
}; 
function recursive_get_files(worker, dir) { 
    console.log("Getting directory: " + dir); 
    worker.ftp.ls(dir, function (err, res) { 
     res.forEach(function (file) { 
      if (file.type === 1) { 
       recursive_get_files(worker, dir + "/" + file.name); 
      } else { 
       worker.ftp.get(dir + "/" + file.name, "/downloads" + dir + "/" + file.name, function(err) { 
        if (err) { 
         console.log("Couldn't download file: " + file.name); 
         console.log(err); 
        } 
       }.bind(file.name)); 
      } 
     }); 
    }); 
} 

Самая большая проблема, я думаю, что все эти функции получить становятся называется почти сразу после того, как друг с другом, и так как клиент, вероятно, не допускается чтобы вызвать так много вещей, он сломается.

Я видел модуль с именем ftpsync (https://www.npmjs.com/package/ftpsync), выполняющий некоторую удаленную синхронизацию, от локального до удаленного, но мне это нужно наоборот.

Кто-нибудь может мне помочь? Я весь этот день застрял = /.

ответ

0

я был в состоянии исправить это с моим другом, выполнив следующие действия:

function recursive_get_files(workerf, dir) { 
    total_pending++; 
    var worker = workerf; 
    var done = function() { 
     //probably callback here if needed 
     console.log("finished downloading ftp"); 
     wrench.chmodSyncRecursive('downloads', 0777); 
     worker.respond(JSON.stringify({type: "success", message: "Finished"})); 
    }; 
    var func_download = function() { 
     //Is the download queue empty? 
     if(download_queue.length === 0) 
     { 
      total_running--; 

      if(total_running === 0 && total_pending === 0) 
      { 
       done(); 
      } 

      return; 
     } 

     //Get the next download in the queue 
     var download = download_queue[0]; 
     download_queue.splice(0, 1); 

     //Get a free FTP connection 
     var curftp; 
     for(curftp = 0; curftp < total; curftp++) { 
      if (worker.ftp[curftp].used === false) { 
       worker.ftp[curftp].used = true; 
       break; 
      } 
     } 

     //Get the file 
     worker.ftp[curftp].ftp.get(download.dir + "/" + download.file.name, "downloads/" + worker.project + download.dir + "/" + download.file.name, function(file, err) { 
      worker.ftp[curftp].used = false; 
      if (err) 
      { 
       console.log("Couldn't download file with FTP(" + curftp + "): " + file); 
       console.log(err); 
       setTimeout(func_download, 0); 
      } 
      else 
      { 
       console.log("Downloaded file with FTP(" + curftp + "): " + file); 
       setTimeout(func_download, 0); 
      } 
     }.bind(null, download.file.name)); 
    }; 

    //Get a list of the current directory (Using the main connection) 
    worker.mainftp.ls(dir, function (err, res) { 
     res.forEach(function (file) { 
      if (file.type === 1) 
      { 
       mkdirp("downloads/" + worker.project + dir + "/" + file.name, function(err) { 
        if (err) console.log(err); 
        recursive_get_files(worker, dir + "/" + file.name); 
       }); 
      } 
      else 
      { 
       download_queue.push({file: file, dir: dir}); 

       if(total_running < total) 
       { 
        total_running++; 
        setTimeout(func_download, 0); 
       } 
      } 
     }); 
    }); 

    total_pending--; 
    if(total_running === 0 && total_pending === 0 && download_queue.length === 0) 
    { 
     done(); 
    } 
} 

использует wrench.js (для рекурсивного CHMOD) и jsftp. Спасибо за чтение ^^