首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Node从FTP服务器下载文件到客户端

使用Node从FTP服务器下载文件到客户端
EN

Stack Overflow用户
提问于 2020-11-08 09:41:11
回答 1查看 3.5K关注 0票数 0

系统架构

系统由三个组件组成

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

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

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

我做了什么,

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

代码语言:javascript
运行
复制
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服务器上名为Node.js的目录中。实际上,我想要做的是将文件直接下载到客户端计算机。为了将文件直接下载到客户端,我尝试了从下载方法中流writeStream对象。这是那个的代码

代码语言:javascript
运行
复制
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下载该文件。这种方法的问题是文件在我开始下载时还没有完成,导致文件下载不完整。例如,如果文件大小为10 MB,并且在客户端单击链接时仅下载了2 MB,那么它将只下载2MB文件,而不是10 MB。

目标

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

需求

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

约束

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-11-08 10:14:11

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

代码语言:javascript
运行
复制
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);
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64736638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档