我正在使用knox访问我的 Amazon S3 存储桶以进行文件存储。我正在存储各种文件 - 主要是 MS Office 和 pdf,但可能是二进制文件或任何其他类型的文件。我还使用express 4.13.3 和带有connect-busboy 的 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 - 但下载的内容已损坏且无法打开。如您所见,我正在使用 express'.attachment
来设置 mime 类型和.append
附加标头的标头(.set
改用没有区别)。
当文件在 Chrome 中下载时,我看到消息“ Resource interpreted as Document but transferred with MIME type application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:
”(对于 Excel 文件),因此 express 正确设置了标题,并且下载的文件的大小与我在检查存储桶时看到的匹配。
任何想法出了什么问题?