0

我想使用绝对 FTP URL 下载文件,例如ftp://host:port/dir/file.extension

我试过了node-libcurl, wget, wget-improved, request。都失败了,说协议必须是 HTTP 或 HTTPS。

有可用于 Node 的 FTP 客户端(在 npmjs 上可用)。但是,根据他们的文档,他们需要创建到 FTP 服务器的连接,更改目录然后下载它。

有没有简单的解决方案?

4

2 回答 2

2

我将在这里概述一个简单的方法(并且没有完整的代码解决方案!)。FTP基于具有简单人类可读协议的TCP 。为了从 FTP 服务器获取文件,您需要执行以下操作:

  1. 使用创建 TCP 套接字net.Socket
  2. 用于socket.connect在端口 21 上连接到您的 FTP 服务器
  3. socket.write使用发送数据和socket.on('data')读取数据与服务器通信

此博客文章中提供了用于简单文件检索的 FTP 协议示例,可总结如下:

  1. 使用连接到服务器net.Socket.connect
  2. USER使用命令设置用户
  3. 使用身份验证PASS
  4. 使用转到所需的目录CWD
  5. 使用更改为被动模式PASV
  6. 读取服务器回复以找出要连接的 IP 和端口以获取文件
  7. 在上一步的 IP 和端口上打开另一个套接字
  8. 瞧!
于 2016-08-05T09:43:30.610 回答
1

你可以使用,我不知道你是怎么做到的,但这里有一些工作代码。

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 );

存储库当前有一个示例显示如何使用通配符匹配下载文件,我只是将 URL 更改为直接指向文件,并删除了WILDCARDMATCHandCHUNK_*_FUNCTION选项。

于 2016-09-22T15:56:48.247 回答