我想使用绝对 FTP URL 下载文件,例如ftp://host:port/dir/file.extension
我试过了node-libcurl, wget, wget-improved, request
。都失败了,说协议必须是 HTTP 或 HTTPS。
有可用于 Node 的 FTP 客户端(在 npmjs 上可用)。但是,根据他们的文档,他们需要创建到 FTP 服务器的连接,更改目录然后下载它。
有没有简单的解决方案?
我想使用绝对 FTP URL 下载文件,例如ftp://host:port/dir/file.extension
我试过了node-libcurl, wget, wget-improved, request
。都失败了,说协议必须是 HTTP 或 HTTPS。
有可用于 Node 的 FTP 客户端(在 npmjs 上可用)。但是,根据他们的文档,他们需要创建到 FTP 服务器的连接,更改目录然后下载它。
有没有简单的解决方案?
我将在这里概述一个简单的方法(并且没有完整的代码解决方案!)。FTP基于具有简单人类可读协议的TCP 。为了从 FTP 服务器获取文件,您需要执行以下操作:
net.Socket
socket.connect
在端口 21 上连接到您的 FTP 服务器socket.write
使用发送数据和socket.on('data')
读取数据与服务器通信此博客文章中提供了用于简单文件检索的 FTP 协议示例,可总结如下:
net.Socket.connect
USER
使用命令设置用户PASS
CWD
PASV
你可以使用node-libcurl,我不知道你是怎么做到的,但这里有一些工作代码。
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 更改为直接指向文件,并删除了WILDCARDMATCH
andCHUNK_*_FUNCTION
选项。