ファイルストレージ用の Amazon S3 バケットにアクセスするためにknoxを使用しています。私はあらゆる種類のファイルを保存しています - 主にMS Officeとpdfですが、バイナリまたはその他の種類のファイルである可能性があります。また、ストリーミングをサポートするために、 express 4.13.3 とbusboyとconnect-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 はヘッダーを正しく設定しており、ダウンロードされたファイルのサイズは、バケットを調べたときに表示されるものと一致します。
何がうまくいかないのですか?