在我的Node.js/Express云铸造应用程序中,使用fs.pipe()将文件下载到本地计算机有问题。
基本上,一个POST请求被发送到我的服务器端代码,其中包含我的用户想要下载的文件名。我使用npm模块ssh2-sftp客户端的GET命令访问文件。最后,使用npm模块下载文件夹将该文件保存到用户本地下载文件夹中以标识该位置。代码如下所示:
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
发布于 2018-11-19 12:59:18
//将文件下载到用户机器。
但是它并没有这样做:它将文件下载到正在运行服务器代码的机器上。这就是为什么当您在本地主机上运行服务器时,它似乎可以工作,因为服务器机器和用户机器是相同的。
提供文件作为下载包括通过响应对象流文件,确保设置正确的头。就像这样:
sftp.get(remoteFilename).then((stream) => {
res.set('content-disposition', `attachment; filename="${ req.body.file }"`);
stream.pipe(res);
});当提供作为“附件”的文件时,它通常打开浏览器的下载窗口,浏览器停留在同一个页面上。您不能同时流和执行重定向,但是由于浏览器不更改URL,这应该可以。
此外,您也无法控制用户将文件下载到何处。它可能是下载文件夹,但他们可以自由选择另一个文件夹。
https://stackoverflow.com/questions/53372086
复制相似问题