«Нет такого файла или каталога»: загрузка нескольких файлов из S3 - PullRequest
0 голосов
/ 29 января 2019

У меня есть метод 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 голосов
/ 30 января 2019

Проблема заключалась в том, что мои ключи файлов 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); });
0 голосов
/ 29 января 2019

Вы должны быть немного более подробными с требованиями.Я имею в виду, каков вариант использования: есть ли какой-нибудь общий префикс всех файлов 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-интерфейсы, позволяющие добиться этого лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...