代码之家  ›  专栏  ›  技术社区  ›  arcade16

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

  •  0
  • arcade16  · 技术社区  · 5 年前

    我有一个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 回复  |  直到 5 年前
        1
  •  0
  •   Vipin Sharma    5 年前

    你需要更详细地了解这些要求。我的意思是,用例是什么样的,您想要下载的所有S3文件是否都有共同的前缀,大小是否有限制等等。 下面的代码使用Java AWS S3-SDK 1.11136。我正在下载该位置的所有对象。请注意,这是打多个电话(不建议)。

      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可以更好地实现这一点。

        2
  •  0
  •   arcade16    5 年前

    问题是我的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); });