ユーザーが複数のファイル名をテキスト入力ボックスに入力できるようにするアプリケーションがあり、送信時にこれらのファイル名が 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つのファイルのダウンロードには問題なく機能しますが、サーバーの知識が限られているため、ヘッダーは1回送信されるため、ファイル名をループに設定して1つずつ送信することはできません。
私がリンクした質問でのMscdexの回答は次のように説明しています:
そのような複数のファイルを単一の応答で送信する方法はありません。独自の特別なフォーマット (標準のマルチパートなど) を使用し、それをクライアント側で (XHR などを介して) 解析しない限りです。
正直なところ手がかりがないので、誰かが「独自の特別なフォーマットを使用すること」が何を意味するのかを説明し、おそらく実証できますか。
また、可能であれば、ファイルを圧縮することは避けたいと思います。
よろしくお願いします、G