6

これは簡単なことだと思いますが、解決策を見つけることはできません:s

Amazon S3 に保存されている画像をウェブサイトに表示する最良の方法を見つけようとしています。

現在、これを機能させようとしています(失敗)

//app.js
app.get('/test', function (req, res) {
    var file = fs.createWriteStream('slash-s3.jpg');
    client.getFile('guitarists/cAtiPkr.jpg', function(err, res) {
        res.on('data', function(data) { file.write(data); });
        res.on('end', function(chunk) { file.end(); });
    });
});

//index.html
<img src="/test" />

アマゾンから直接画像を表示することは可能ではないでしょうか? つまり、サーバーの負荷を軽減するソリューションが最適です。

4

2 に答える 2

13

これはストリームの典型的な使用例です。やりたいことは、Amazon S3 からファイルをリクエストし、このリクエストの応答 (画像など) をクライアントに直接リダイレクトすることです。一時ファイルは保存しません。これ.pipe()は、ストリームの機能を使用して行うことができます。

ストリーム オブジェクトの標準イベントである.on('data')とを既に使用しているため、Amazon S3 のクエリに使用するライブラリがストリームを返すと仮定します。.on('end')

これを行う方法は次のとおりです。

app.get('/test', function (req, res) {
    client.getFile('guitarists/cAtiPkr.jpg', function(err, imageStream) {
        imageStream.pipe(res);
    });
});

パイプを使用して、S3 へのリクエストの出力をクライアントに直接リダイレクトします。resS3 へのリクエストがクローズすると、これにより、エクスプレスの が自動的に終了します。

ストリームの詳細については、substack の優れたStream Handbookを参照してください。

PS: コード スニペットには という名前の 2 つの変数があることに注意してください。res内側の変数が外側の変数をマスクし、バグを見つけるのが困難になる可能性があります。

于 2013-11-09T22:02:37.077 に答える