Expressjsフレームワークにはsendfile()
メソッドがあります。フレームワーク全体を使用せずにそれを行うにはどうすればよいですか?
node-native-zipを使用してアーカイブを作成していますが、それをユーザーに送信したいと思います。
Expressjsフレームワークにはsendfile()
メソッドがあります。フレームワーク全体を使用せずにそれを行うにはどうすればよいですか?
node-native-zipを使用してアーカイブを作成していますが、それをユーザーに送信したいと思います。
ディスクからストリーミングすることによって myfile.mp3 を送信するプログラムの例を次に示します (つまり、ファイルを送信する前にファイル全体をメモリに読み込みません)。サーバーはポート 2000 でリッスンします。
[更新] @Aftershock がコメントで述べたように、はなくなり、Stream プロトタイプの;util.pump
と呼ばれるメソッドに置き換えられました。pipe
以下のコードはこれを反映しています。
var http = require('http'),
fileSystem = require('fs'),
path = require('path');
http.createServer(function(request, response) {
var filePath = path.join(__dirname, 'myfile.mp3');
var stat = fileSystem.statSync(filePath);
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': stat.size
});
var readStream = fileSystem.createReadStream(filePath);
// We replaced all the event handlers with a simple call to readStream.pipe()
readStream.pipe(response);
})
.listen(2000);
http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/から取得
Stream を使用して応答でファイル (アーカイブ) を送信する必要があります。さらに、応答ヘッダーで適切な Content-type を使用する必要があります。
それを行う関数の例があります:
const fs = require('fs');
// Where fileName is name of the file and response is Node.js Reponse.
responseFile = (fileName, response) => {
const filePath = "/path/to/archive.rar"; // or any file format
// Check if file specified by the filePath exists
fs.exists(filePath, function (exists) {
if (exists) {
// Content-type is very interesting part that guarantee that
// Web browser will handle response in an appropriate manner.
response.writeHead(200, {
"Content-Type": "application/octet-stream",
"Content-Disposition": "attachment; filename=" + fileName
});
fs.createReadStream(filePath).pipe(response);
return;
}
response.writeHead(400, { "Content-Type": "text/plain" });
response.end("ERROR File does not exist");
});
}
Content-Type フィールドの目的は、受信ユーザー エージェントが適切なエージェントまたはメカニズムを選択してユーザーにデータを提示したり、適切な方法でデータを処理したりできるように、本文に含まれるデータを十分に説明することです。
「application/octet-stream」は、RFC 2046 で「任意のバイナリ データ」として定義されています。このコンテンツ タイプの目的は、ディスクに保存することです。これが本当に必要なものです。
「filename=[ファイル名]」でダウンロードするファイル名を指定します。
詳細については、この stackoverflow トピックを参照してください。