我的目标:
显示一个对话框,提示用户保存从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!'); }); };
编写此代码的目的是让用户使用生成的密钥一次下载文件。
这是在最新版本的aws-sdk上使用流传输的完整代码
var express = require('express'); var app = express(); var fs = require('fs'); app.get('/', function(req, res, next){ res.send('You did not say the magic word'); }); app.get('/s3Proxy', function(req, res, next){ // download the file via aws s3 here var fileKey = req.query['fileKey']; console.log('Trying to download file', fileKey); var AWS = require('aws-sdk'); AWS.config.update( { accessKeyId: "....", secretAccessKey: "...", region: 'ap-southeast-1' } ); var s3 = new AWS.S3(); var options = { Bucket : '/bucket-url', Key : fileKey, }; res.attachment(fileKey); var fileStream = s3.getObject(options).createReadStream(); fileStream.pipe(res); }); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('S3 Proxy app listening at http://%s:%s', host, port); });