Node.js-将多个文件作为附件从服务器推送到客户端

时间:2018-11-21 10:04:23

标签: node.js express xmlhttprequest ssh2-sftp

我有一个允许用户在文本输入框中输入多个文件名的应用程序,提交后,这些文件名将从SFTP服务器中获取并返回给客户端并下载。

该应用看起来像这样:

Application

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

1 个答案:

答案 0 :(得分:2)

“使用您自己的特殊格式” 可能可以使用的解决方案,但它是非标准解决方案,也需要自定义客户端(浏览器) )代码将其提取。我建议不要这样做,并使用下一个最好的方法:创建一个ZIP文件。

或者,在客户端代码中,您可以将每个 <input>包装在自己的<form>中,然后在按下Submit按钮时,使用一些JS -可以提交所有这些表格的代码。在这种情况下,每种形式都会触发一次下载,因此服务器端代码将只是else块。