我有一个允许用户在文本输入框中输入多个文件名的应用程序,提交后,这些文件名将从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);
});
}
})
我的问题是:如何从该服务器端代码发送多个文件以下载到客户端?
我在这里看到了这个问题:Sending multiple files down the pipe,但给出的答案并未真正详细说明解决方案。我知道我的代码将永远无法用于多个文件,我只是将其附加为演示到目前为止我所拥有的方法。可以下载1个文件,但工作得很好,因为据我了解的服务器知识有限,标头只发送一次,所以我无法循环设置文件名并一一发送。
我链接到的问题中的Mscdex的答案说明:
除非您使用自己的特殊格式(标准多部分格式或其他格式),然后在客户端(例如通过XHR)进行解析,否则无法在单个响应中发送多个文件,
有人可以解释并演示“使用您自己的特殊格式意味着什么”,因为我实在没有任何线索。
此外,我尽可能避免压缩文件。
非常感谢, G
答案 0 :(得分:2)
“使用您自己的特殊格式” 是可能可以使用的解决方案,但它是非标准解决方案,也需要自定义客户端(浏览器) )代码将其提取。我建议不要这样做,并使用下一个最好的方法:创建一个ZIP文件。
或者,在客户端代码中,您可以将每个 <input>
包装在自己的<form>
中,然后在按下Submit按钮时,使用一些JS -可以提交所有这些表格的代码。在这种情况下,每种形式都会触发一次下载,因此服务器端代码将只是else
块。