2015-11-04 151 views
1

我正在使用knox訪問我的Amazon S3存儲桶以進行文件存儲。我存儲各種文件 - 主要是MS Office和pdf,但可以是二進制文件或其他類型的文件。我還使用express 4.13.3和busboyconnect-busboy進行流支持;當我上傳文件時,我正在使用busboy進行處理,然後通過knox直接指向S3,因此不必先將它們寫入本地磁盤。使用Knox和Node.js從Amazon 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(); 

的文件下載到瀏覽器 - 我使用的是約翰Culviner的jquery.fileDownload.js - 但什麼是下載已損壞,無法打開。正如您所看到的,我使用快速'.attachment設置MIME類型的標頭,.append設置其他標頭(使用.set代替沒有區別)。

當文件在Chrome中下載時,我看到'Resource interpreted as Document but transferred with MIME type application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:'(對於Excel文件)的消息,因此express會正確設置標頭,下載文件的大小與我在查看存儲桶時看到的大小相匹配。

任何想法發生了什麼問題?

回答

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(); 
}); 

它也將在同一時間發送數據的一個塊,因爲它來的,所以它應該是更多的內存使用效率。