当前位置: 首页 > 面试题库 >

NodeJS如何从aws s3存储桶中将文件下载到磁盘?

游乐池
2023-03-14
问题内容

我的目标:

显示一个对话框,提示用户保存从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);
});


 类似资料:
  • 我需要从我的谷歌云存储从我的桶中下载NodeJS文件夹。我读了所有的留档,我只找到了下载文件而不是文件夹的方法。我需要获取/下载文件夹以提供用户的下载文件。 有人能帮我吗?

  • 问题内容: 目标 将文件从s3存储桶下载到用户计算机。 语境 我正在为React应用开发Python / Flask API。当用户单击前端上的“下载”按钮时,我想将适当的文件下载到他们的计算机上。 我尝试过的 我目前正在使用一些代码来查找下载文件夹的路径,然后将该路径以及他们试图下载的存储桶中的文件作为第二个参数插入到download_file()中。 这在本地有效,并且测试运行良好,但是一旦部

  • 我有一个处理CSV文件并返回一些分析的应用程序。我的用户将文件存储在GCP云存储桶中,我希望他们能够向我传递一个存储桶URL和一些身份验证令牌/签名URL,然后应用程序将下载文件并根据需要解析它们。 阅读GCP留档时,我遇到了以下gsutil命令: 这正是我所需要的,但是我正在通过一些REST API HTTP请求寻找同样的功能。我肯定有这样的东西存在,但似乎找不到。或者,如果我可以“列出”一个存

  • 我是Google Cloud Platform的新手。我已经在datalab上训练了我的模型,并将模型文件夹保存在云存储中。我可以通过右键单击文件将桶中的现有文件下载到本地计算机-

  • 有没有一种方法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS帐户中。我可以使用aws cli命令一次复制一个文件: 然而,我有1000份文件要复制。我不想复制源存储桶中的所有文件,因此无法使用sync命令。有没有一种方法可以用需要复制的文件名列表来调用一个文件,从而自动化这个过程?