首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node/Express:没有使用fs.pipe()下载的文件

Node/Express:没有使用fs.pipe()下载的文件
EN

Stack Overflow用户
提问于 2018-11-19 09:54:10
回答 1查看 1.7K关注 0票数 0

在我的Node.js/Express云铸造应用程序中,使用fs.pipe()将文件下载到本地计算机有问题。

基本上,一个POST请求被发送到我的服务器端代码,其中包含我的用户想要下载的文件名。我使用npm模块ssh2-sftp客户端的GET命令访问文件。最后,使用npm模块下载文件夹将该文件保存到用户本地下载文件夹中以标识该位置。代码如下所示:

代码语言:javascript
复制
app.post('/download-file', function(req, res) {

    // Declare the files remote and local path as a variable.
    const remoteFilename = 'invoice/csv/' + req.body.file;
    const localFilename = downloadsFolder() + '/' + req.body.file;

    // Use the SFTP GET command to get the file passing its remote path variable.
    sftp.get(remoteFilename).then((stream) => {

        // Download the file to the users machine.
        stream.pipe(fs.createWriteStream(localFilename));

        // Redirect user.
        res.redirect('/invoice')
    });
})

在本地运行和下载文件时,这是完美的,没有任何问题。如此屏幕截图所示,目标文件路径的输出如下:

但是,当我使用cloud将其推送给云铸造提供商时,应用程序仍然工作正常,但当我想下载文件时,它会失败。在捕获错误时没有错误,唯一改变的是目标文件路径的输出已更改为:

我不知道这是为什么,这段代码在Chrome和Safari中运行很好,在本地运行时,但是在托管时却什么都不做。有人能解释一下这是怎么回事吗?

非常感谢,G

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-19 12:59:18

//将文件下载到用户机器。

但是它并没有这样做:它将文件下载到正在运行服务器代码的机器上。这就是为什么当您在本地主机上运行服务器时,它似乎可以工作,因为服务器机器和用户机器是相同的。

提供文件作为下载包括通过响应对象流文件,确保设置正确的头。就像这样:

代码语言:javascript
复制
sftp.get(remoteFilename).then((stream) => {
  res.set('content-disposition', `attachment; filename="${ req.body.file }"`);
  stream.pipe(res);
});

当提供作为“附件”的文件时,它通常打开浏览器的下载窗口,浏览器停留在同一个页面上。您不能同时流和执行重定向,但是由于浏览器不更改URL,这应该可以。

此外,您也无法控制用户将文件下载到何处。它可能是下载文件夹,但他们可以自由选择另一个文件夹。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53372086

复制
相关文章

相似问题

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