“没有这样的文件或目录”:从S3下载多个文件

时间:2019-01-29 01:22:43

标签: javascript node.js amazon-s3

我有一个API方法,该方法在调用并传递文件密钥字符串时,会将其转换为数组,然后从S3下载它们。但是,当我调用此API时,在服务器上收到错误Error: ENOENT: no such file or directory, open <filename here>

这是我的api:

reports.get('/xxx/:fileName', async (req, res) => {

  var AWS = require('aws-sdk');

  var s3 = new AWS.S3();

  var str_array = req.params.fileName.split(','); 

  for (var i = 0; i < str_array.length; i++) {
    var filename = str_array[i].trim();
    localFileName = './' + filename;

    let file = fs.createWriteStream(localFileName);   

    s3.getObject({
      Bucket: config.reportBucket,
      Key: filename
    })
    .on('error', function (err) {
      res.end("File download failed with error " + err.message);            
    })
    .on('httpData', function (chunk) {
      file.write(chunk);
    })
    .on('httpDone', function () {
      file.end();
    })
    .send();
  }
  res.end("Files have been downloaded successfully")
});

如何通过传递密钥数组从S3成功下载多个文件?

2 个答案:

答案 0 :(得分:0)

您需要稍微更详细地了解需求。我的意思是用例是什么样的?是否要下载所有S3文件的公共前缀,大小是否有限制等? 下面的代码使用java aws-s3-sdk 1.11.136。我正在下载该位置上存在的所有对象。请注意,这正在打多个电话(不建议)。

  public void downloadMultipleS3Objects(String[] objectPaths){
       Arrays.stream(objectPaths)
            .filter(objectPath ->   amazonS3.doesObjectExist("BUCKET_NAME",objectPath))
            .forEach(objectPath -> amazonS3.getObject("BUCKET_NAME", objectPath).getObjectContent())})};// todo you may write this stream to a file 

注意:如果所有对象都有一个通用前缀,则可以使用其他API更好地实现此目的。

答案 1 :(得分:0)

问题是我的AWS文件密钥弄乱了文件的路径。 AWS密钥遵循文件夹层次结构,因此放置在文件夹中的文件将具有folderName/fileName密钥。我通过执行以下操作删除了文件夹名称:

localFileName = './temp/' + filename.substring(filename.indexOf("/") + 1);

此外,我还必须执行以下操作才能在下载新文件时在磁盘上创建它们:

file = fs.createWriteStream(localFileName, {flags: 'a', encoding: 'utf-8',mode: 0666});
file.on('error', function(e) { console.error(e); });