如何在NodeJS中通过FTP下载文件?

时间:2016-08-05 02:30:40

标签: node.js ftp npm npm-request

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

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

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

有没有简单的解决方案?

2 个答案:

答案 0 :(得分:2)

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

  1. 使用net.Socket
  2. 创建TCP套接字
  3. 使用var today = new Date(); today = new Date(today.setHours(0,0,0,0)); console.log('Date: '+today); 连接到端口21上的FTP服务器
  4. 使用socket.write与服务器通信以发送数据,socket.on('data')与数据进行通信
  5. this blog post中提供了用于简单文件检索的FTP协议示例,可归纳如下:

    1. 使用socket.connect
    2. 连接到服务器
    3. 使用net.Socket.connect命令
    4. 设置用户
    5. 使用USER
    6. 进行身份验证
    7. 使用PASS
    8. 转到所需目录
    9. 使用CWD
    10. 更改为被动模式
    11. 读取服务器回复,找出要连接的IP和端口以获取文件
    12. 在上一步的IP和端口上打开另一个套接字
    13. 瞧!

答案 1 :(得分: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更改为直接指向该文件,并删除了WILDCARDMATCHCHUNK_*_FUNCTION选项