我在NodeJS中使用请求模块从AWS S3读取数据。当我使用下面的代码下载文件(docx或图像或pdf)时,它给我一个无效/损坏的文件。但是当我下载.txt文件时,它没有被破坏,我能够在记事本中看到文件。
我做了一些谷歌搜索,并建议也尝试将编码设置为二进制,仍然没有给出所需的结果。
文件上传工作正常。我可以在AWS控制台中看到上传的文件。
文件下载代码
int
更新: - 我已经缩小了错误,只是尝试通过从本地文件系统读取文件来发送文件。即便如此,也会在客户端上提供损坏的文件。 这是相同的代码
var s3 = new properties.AWS.S3();
var params = {Bucket: properties.AWS_BUCKET, Key: req.headers['x-org'] + "/" + "talk" + "/" + req.body.fileName};
s3.getSignedUrl('getObject', params, function (err, URL) {
if (err) {
console.log("Error inside the S3");
console.log(err, err.stack); // an error occurred
res.send(null);
} else {
console.log("After getObject:-" + URL);
request({
url: URL, //URL to hit
method: 'GET',
encoding: 'binary'
}, function (error, response, body) {
if (error) {
console.log(error);
} else {
//console.log(response.statusCode, body);
res.set('content-disposition', 'attachment; filename=' + req.body.fileName);
res.send(body);
}
});
}
});
答案 0 :(得分:2)
终于能够解决问题了。
从此博客https://templth.wordpress.com/2014/11/21/handle-downloads-with-angular/获得解决方案提示。
根据此博客
使用zip文件或图像等二进制内容进行测试时,我们会看到 下载的内容已损坏。这是因为 Angular会自动对接收的数据应用转换。 处理二进制内容时,我们希望将它们作为数组缓冲区。
最终工作代码是: -
var filePath = path.join(__dirname, '..', '..', '..', 'downloads', req.body.fileURL);
var file = fs.createWriteStream(filePath);
s3.getObject(params).
on('httpData', function(chunk) {
//console.log("inside httpData");
file.write(chunk);
}).
on('httpDone', function() {
console.log("inside httpDone");
file.end();
//file.pipe(res);
}).
send(function() {
console.log("inside send");
res.setHeader('Content-disposition', 'attachment; filename=' + filePath);
res.setHeader('Content-type', mimetype);
res.setHeader('Transfer-Encoding', 'chunked');
var filestream = fs.createReadStream(filePath);
filestream.pipe(res);
});