2016-08-05 3 views
0

Я хочу загрузить файл с использованием абсолютного FTP-адреса, например ftp://host:port/dir/file.extensionКак загрузить файл через FTP в NodeJS?

Я пробовал node-libcurl, wget, wget-improved, request. Все не удалось сказать, что протокол должен быть либо HTTP, либо HTTPS.

Доступны FTP-клиенты для узла (доступно на npmjs). Но, согласно их документации, им требуется создать соединение с FTP-сервером, сменить каталог, а затем загрузить его.

Есть ли какое-нибудь простое решение?

ответ

2

Я опишу простой подход здесь (и не будет полного решения с кодом!). FTP основан на TCP с простым человекообразным протоколом. Для того, чтобы принести файл с FTP-сервера, необходимо выполнить следующие действия:

  1. Создание TCP сокет, используя net.Socket
  2. Используйте socket.connect для подключения к FTP-серверу на порт 21
  3. Связь с сервером используя socket.write для передачи данных и socket.on('data') для чтения данных

пример протокола для ФЦП простого извлечения файлов предоставляется в this blog post и могут быть обобщены следующим образом:

  1. Подключение к серверу с помощью net.Socket.connect
  2. Set пользователю USER команды
  3. Аутентифицировать с PASS
  4. Перейти к нужному каталогу, используя CWD
  5. Изменение в пассивном режиме с использованием PASV
  6. чтение сервера ответ узнать IP и порт для подключения к файлу
  7. Открыть другой разъем на IP и порт предыдущего шага
  8. Voilà!
0

Вы можете использовать , я точно не знаю, как вы это сделали, но вот какой-то рабочий код.

var Curl = require('node-libcurl').Curl, 
    Easy = require('node-libcurl').Easy, 
    path = require('path'), 
    fs = require('fs'); 

var handle = new Easy(), 
    url = 'ftp://speedtest.tele2.net/1MB.zip', 
    // Download file to the path given as first argument 
    // or to a file named 1MB.zip on current dir 
    fileOutPath = process.argv[2] || path.join(process.cwd(), '1MB.zip'), 
    fileOut  = fs.openSync(fileOutPath, 'w+'); 

handle.setOpt(Curl.option.URL, url); 

handle.setOpt(Curl.option.WRITEFUNCTION, function(buff, nmemb, size) { 

    var written = 0; 

    if (fileOut) { 

     written = fs.writeSync(fileOut, buff, 0, nmemb * size); 

    } 

    return written; 
}); 

handle.perform(); 
fs.closeSync(fileOut); 

Репозиторий в настоящее время имеет один example, показывающий, как загрузить файл с помощью подстановки соответствия, я просто изменил URL, чтобы она указывала на файл, и удалил WILDCARDMATCH и CHUNK_*_FUNCTION варианты.

Смежные вопросы