133

Expressjsフレームワークにはsendfile()メソッドがあります。フレームワーク全体を使用せずにそれを行うにはどうすればよいですか?

node-native-zipを使用してアーカイブを作成していますが、それをユーザーに送信したいと思います。

4

5 に答える 5

211

ディスクからストリーミングすることによって 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/から取得

于 2012-04-06T17:35:50.427 に答える
18

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 トピックを参照してください。

于 2016-08-10T08:26:05.033 に答える