Node.js - 将多个文件作为附件从服务器推送到客户端
Node.js - Pushing multiple files as attachments from server to client
我有一个应用程序,它允许用户在文本输入框中输入多个文件名,并在提交时从 SFTP 服务器获取这些文件名并返回给客户端并下载。
该应用看起来像这样:
POST 请求的代码如下所示:
// Declare variables.
var files = req.body.input;
var i = 0;
// Check if request body is an array or single value.
if ( Array.isArray(files) ) {
// Loop through the array of file names.
function myLoop() {
setTimeout(function() {
// Declare the files remote and local paths as variables.
var remoteFilename = '../mnt/volume_lon1_01/test/files/processed/' + files[i] + '.csv.gz';
var localFilename = files[i] + '.csv.gz'
// Use the SFTP Get command to get the files.
sftp.get(remoteFilename).then((stream) => {
// Pass the file back to the client side for download.
res.set('content-disposition', `attachment; filename="${ localFilename }"`);
stream.pipe(res);
});
// Increment the counter.
i++;
}, 200)
}
myLoop();
} else {
// If the request body is a single value, declare the files remote and local path as a variable.
var remoteFilename = '../mnt/volume_lon1_01/test/files/processed/' + files + '.csv.gz';
var localFilename = files[i] + '.csv.gz'
// Use the SFTP Get command to get the files.
sftp.get(remoteFilename).then((stream) => {
// Pass the file back to the client side for download.
res.set('content-disposition', `attachment; filename="${ localFilename }"`);
stream.pipe(res);
});
}
})
我的问题是:如何从服务器端代码向客户端发送多个文件以供下载?
我在这里看到了这个问题: 但给出的答案并没有真正详细说明解决方案。我知道我的代码永远不会适用于多个文件,我只是附上它作为展示我到目前为止所拥有的东西的一种方式。它可以很好地下载 1 个文件,但仅此而已,因为据我所知,服务器知识有限,headers 发送一次,所以我不能循环设置文件名并一个一个地发送它们。
Mscdex 在我链接到的问题中的回答解释了:
There is no way to send multiple files like that in a single response, unless you use your own special formatting (standard multipart or otherwise) and then parse that on the client side (e.g. via XHR).
有人可以解释并演示什么吗 'Using your own special formatting means' 因为老实说我一点头绪都没有。
此外,我想尽可能避免压缩文件。
非常感谢,
G
"Using your own special formatting" 是一个 可能 可行的解决方案,但它是一个非标准解决方案,还需要自定义客户端(浏览器)代码来实现它。我会反对它,并使用下一个最好的方法:创建一个 ZIP 文件。
或者,在客户端代码中,您可以将 each <input>
包装在它自己的 <form>
中,当按下提交按钮时,使用一些 JS 代码来提交 all 这些表单。在这种情况下,每个表单都会触发一次下载,因此服务器端代码只是 else
块。
我有一个应用程序,它允许用户在文本输入框中输入多个文件名,并在提交时从 SFTP 服务器获取这些文件名并返回给客户端并下载。
该应用看起来像这样:
POST 请求的代码如下所示:
// Declare variables.
var files = req.body.input;
var i = 0;
// Check if request body is an array or single value.
if ( Array.isArray(files) ) {
// Loop through the array of file names.
function myLoop() {
setTimeout(function() {
// Declare the files remote and local paths as variables.
var remoteFilename = '../mnt/volume_lon1_01/test/files/processed/' + files[i] + '.csv.gz';
var localFilename = files[i] + '.csv.gz'
// Use the SFTP Get command to get the files.
sftp.get(remoteFilename).then((stream) => {
// Pass the file back to the client side for download.
res.set('content-disposition', `attachment; filename="${ localFilename }"`);
stream.pipe(res);
});
// Increment the counter.
i++;
}, 200)
}
myLoop();
} else {
// If the request body is a single value, declare the files remote and local path as a variable.
var remoteFilename = '../mnt/volume_lon1_01/test/files/processed/' + files + '.csv.gz';
var localFilename = files[i] + '.csv.gz'
// Use the SFTP Get command to get the files.
sftp.get(remoteFilename).then((stream) => {
// Pass the file back to the client side for download.
res.set('content-disposition', `attachment; filename="${ localFilename }"`);
stream.pipe(res);
});
}
})
我的问题是:如何从服务器端代码向客户端发送多个文件以供下载?
我在这里看到了这个问题:
Mscdex 在我链接到的问题中的回答解释了:
There is no way to send multiple files like that in a single response, unless you use your own special formatting (standard multipart or otherwise) and then parse that on the client side (e.g. via XHR).
有人可以解释并演示什么吗 'Using your own special formatting means' 因为老实说我一点头绪都没有。
此外,我想尽可能避免压缩文件。
非常感谢, G
"Using your own special formatting" 是一个 可能 可行的解决方案,但它是一个非标准解决方案,还需要自定义客户端(浏览器)代码来实现它。我会反对它,并使用下一个最好的方法:创建一个 ZIP 文件。
或者,在客户端代码中,您可以将 each <input>
包装在它自己的 <form>
中,当按下提交按钮时,使用一些 JS 代码来提交 all 这些表单。在这种情况下,每个表单都会触发一次下载,因此服务器端代码只是 else
块。