1

ファイルストレージ用の Amazon S3 バケットにアクセスするためにknoxを使用しています。私はあらゆる種類のファイルを保存しています - 主にMS Officeとpdfですが、バイナリまたはその他の種類のファイルである可能性があります。また、ストリーミングをサポートするために、 express 4.13.3 とbusboyconnect-busboyを使用しています。ファイルをアップロードするとき、私は busboy で処理し、そこから knox 経由で S3 に直接送信するため、最初にローカル ディスクに書き込む必要がなくなります。

ファイルは正常にアップロードされます ( Transmitを使用して手動で参照およびダウンロードできます) が、ダウンロードに問題があります。

わかりやすくするために、ファイルをローカル ディスクに書き込むのではなく、メモリ内バッファーに保持します。GET リクエストを処理するために使用しているコードは次のとおりです。

// instantiate a knox object
var s3client = knox.createClient({
  key: config.AWS.knox.key,
  secret: config.AWS.knox.secret,
  bucket: config.AWS.knox.bucket,
  region: config.AWS.region
});

var buffer = undefined;

s3client.get(path+'/'+fileName)
.on('response', function(s3res){

  s3res.setEncoding('binary');

  s3res.on('data', function(chunk){
    buffer += chunk;
  });

  s3res.on('end', function() {
    buffer = new Buffer(buffer, 'binary');
    var fileLength = buffer.length;
    res.attachment(fileName);
    res.append('Set-Cookie', 'fileDownload=true; path=/');
    res.append('Content-Length', fileLength);
    res.status(s3res.statusCode).send(buffer);
  });

}).end();

ファイルがブラウザにダウンロードされます - 私は John Culviner のjquery.fileDownload.jsを使用しています - しかし、ダウンロードされたものは壊れていて開くことができません。ご覧のとおり.attachment、MIME タイプと.append追加ヘッダーのヘッダーを設定するために、express を使用しています (.set代わりに使用しても違いはありません)。

Chrome でファイルをダウンロードすると、「Resource interpreted as Document but transferred with MIME type application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:」(Excel ファイルの場合) というメッセージが表示されるため、Express はヘッダーを正しく設定しており、ダウンロードされたファイルのサイズは、バケットを調べたときに表示されるものと一致します。

何がうまくいかないのですか?

4

1 に答える 1

0

コンテンツがバイナリとしてブラウザに送信されていないようです。次のようなことを試してください。

if (s3Res.headers['content-type']) {
  res.type( s3Res.headers['content-type'] );
}
res.attachment(fileName);

s3Res.setEncoding('binary');
s3Res.on('data', function(data){
  res.write(data, 'binary');
});

s3Res.on('end', function() {
  res.send();
});

また、データが入ってくると一度に 1 つのチャンクで送信されるため、メモリ効率が少し高くなるはずです。

于 2017-01-20T22:37:26.023 に答える