我的目标:
显示一个对话框,提示用户保存正在从aws下载的文件。
我的问题:
我目前正在使用awssum-amazon-s3创建下载流。但是我只设法将文件保存到我的服务器或流到命令行...正如您从我的代码中所看到的,我最后的尝试是尝试手动设置内容处理头,但失败了。我不能使用res.download(),因为头已经设置好了。
我怎样才能实现我的目标?
我的节点代码:
app.post('/dls/:dlKey', function(req, res, next){
// download the file via aws s3 here
var dlKey = req.param('dlKey');
Dl.findOne({key:dlKey}, function(err, dl){
if (err) return next(err);
var files = dl.dlFile;
var options = {
BucketName : 'xxxx',
ObjectName : files,
};
s3.GetObject(options, { stream : true }, function(err, data) {
// stream this file to stdout
fmt.sep();
data.Headers['Content-Disposition'] = 'attachment';
console.log(data.Headers);
data.Stream.pipe(fs.createWriteStream('test.pdf'));
data.Stream.on('end', function() {
console.log('File Downloaded!');
});
});
});
res.end('Successful Download Post!');
});
我的代码为棱角分明:
$scope.dlComplete = function (dl) {
$scope.procDownload = true;
$http({
method: 'POST',
url: '/dls/' + dl.dlKey
}).success(function(data/*, status, headers, config*/) {
console.log(data);
$location.path('/#!/success');
}).error(function(/*data, status, headers, config*/) {
console.log('File download failed!');
});
};
此代码的目的是让用户使用生成的密钥下载一次文件。
7条答案
按热度按时间ghhaqwfi1#
这是在aws-sdk的最新版本上使用流的完整代码
t9aqgxwy2#
下面的代码对我来说适用于最新的库:
8mmmxcuj3#
只需从S3创建一个ReadStream,然后将WriteStream写到你想下载的位置。找到下面的代码。对我来说非常有效:
yh2wf1be4#
您已经知道解决问题最重要的是什么:您可以将来自S3的文件流通过管道传输到任何可写流,无论是文件流...还是将发送到客户端的响应流!
注意
res.attachment
的使用,它将设置正确的头。你也可以检查关于流和S3的this answer。hgc7kmma5#
使用aws SDK v3
下载代码
k4emjkb16#
为此,我使用
React frontend
和node js backend
。前端我使用Axios。我用这个点击按钮下载文件。====节点js后端代码(AWS S3)======
//在
GET
方法内部调用了此函数======Reactjs前端代码========
//此函数处理下载按钮
onClick
------ OR(如果您使用的是标准axios而不是axios拦截器)-----
有关更多信息,请参阅下面的文章1. article 1 2. article 2
2q5ifsrm7#
使用express,基于Jushua的答案和https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_GetObject_section.html