【问题标题】:Download file from FTP server to client using Node js使用Node js将文件从FTP服务器下载到客户端
【发布时间】:2021-02-20 11:41:02
【问题描述】:

系统架构

系统由 3 个组件组成

1:FTP 服务器:用于存储文件。只能由 Node.js 应用程序访问。不能直接访问。

2:Node.js:提供与FTP服务器交互的API。与 FTP 服务器 交互的唯一方式。 Node.js 应用程序没有存储在 FTP 上的文件集合。仅提供使用 FTP 的方法。 Node.js 应用程序不应存储从其上传和下载的任何文件。

3:客户端:用户如何使用Node.js应用程序上传或下载文件到FTP服务器

我做了什么

我可以使用basic-ftp 包下载存储在 FTP 上的文件。这是下载文件功能的代码。

async function downloadFile(folderPath, fileName, writeStream) {
    console.log(folderPath);
    console.log(fileName);
    const client = new ftp.Client()
    // client.ftp.verbose = true
    try {
        await client.access({
            'host': process.env.FTP_HOST,
            'user': process.env.FTP_USER,
            'password': process.env.FTP_PASSWORD,
        });
        await client.ensureDir(folderPath);
        await client.downloadTo(writeStream, fileName);
    }
    catch(err) {
        console.log(err)
    }
    client.close()
}

文件下载到 Node.js 服务器上名为 /downloads 的目录。我实际上想要做的是将文件直接下载到客户端计算机。要将文件直接下载到客户端,我尝试从下载方法流式传输 writeStream 对象。这是代码

app.post("/download/file", urlencodedParser, (req, res, next) => {
    var writeStream = fs.createWriteStream('./downloads/'+req.body.fileName);
    writeStream.on("data", (data) => {
      res.write(data);
    })
    writeStream.on("close", () => {
      res.end()
    })

    res.setHeader('Transfer-Encoding', 'chunked');
    downloadFile(req.body.folderName, req.body.fileName, writeStream);
})

这不起作用。完全下载文件总是以错误结束。

我尝试的另一种方法是为文件生成一个 URL,客户端将单击该 URL 来下载文件。这种方法的问题是在我开始下载时文件不完整,导致文件下载不完整。例如,如果文件大小为 10MB,而客户端点击链接时只下载了 2MB,则它只会下载 2MB 文件而不是 10MB。

目标

通过Node js从FTP服务器下载文件到客户端(浏览器)。

要求

通过Node js将FTP服务器上存储的文件直接下载到客户端。

约束

客户端无权访问 FTP 服务器。

访问服务器的唯一方法是通过 Node js 应用程序。

【问题讨论】:

  • 你好,所以基本上你想从服务器(使用 NodeJS)“桥接”到客户端,这样客户端就永远不会看到 MAIN 服务器,只是 NodeJS 服务器,是这样吗?
  • 是的。我想从服务器桥接到客户端。
  • 我还没有测试过这个,但我认为这可以通过 nodejs 的“net”模块来完成,你可以“管道”从服务器到客户端和服务器的连接只会看到 nodejs 服务器,客户端也只会看到 nodejs 服务器!试试看……
  • 您只需在连接时手动包含 FTP 凭据,在管道之前...

标签: javascript node.js ftp


【解决方案1】:

您可以尝试将res 直接指示为输出流。这样,您只需将流从 ftp 重定向到客户端:

async function downloadFile(fileName, writeStream) {
    console.log(fileName);
    const client = new ftp.Client()
    // client.ftp.verbose = true
    try {
        await client.access({
            'host': process.env.FTP_HOST,
            'user': process.env.FTP_USER,
            'password': process.env.FTP_PASSWORD,
        });
        await client.downloadTo(writeStream, fileName);
    }
    catch(err) {
        console.log(err)
    }
    client.close()
}

app.post("/download/file", urlencodedParser, (req, res, next) => {
    downloadFile(req.body.fileName, res);
})

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多