Как создать вложенные папки в контейнере aws s3, используя nodejs с лямбда-функцией? - PullRequest
0 голосов
/ 29 апреля 2019

В моем проекте я использую Angular 6, nodejs с лямбда-функцией и шлюзом API и ниже - это структура моей папки.

--Bucket Name
   |--Folder (folder name dynamically change based on user login)
         |----sub Folder (sub folder name dynamically change)
            |--- bird.jpg (file name also dynamic)

Я создал корзину и папку, используя приведенный ниже код, и мне нужно создать подпапку в папке и сохранить JPG или текстовый файл. ниже мой код:

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

AWS.config.update({
region: 'us-east-2',
accessKeyId: 'accessid',
secretAccessKey: 'secret id'
});
var s3 = new AWS.S3();

var bucketName = 'bucket name'; 

exports.handler = function uploadToS3(event, context, callback) {
s3.createBucket({Bucket: bucketName}, function() {

var params = {Bucket: bucketName,Key: event['keyName']};
s3.putObject(params, function(err, data) {
  if (err)
    console.log(err);
  else
    console.log("Successfully uploaded data to " + bucketName);
  });
});
callback(null,{ result : 'SUCCESS'});
};

Как создать подпапку в папке и сохранить текстовое или jpg-значение в подпапке ??

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

В S3 нет «подпапок», это плоское хранилище.Это просто файлы в ведре.Однако, если вы включите косую черту в ключ файла, Консоль AWS S3 (и другие инструменты) будет использовать ее для отображения ваших файлов, как если бы они были в «папках».

folder1/folder2/bird.jpg has two »префиксы ", но это один ключ для одного файла.

Так что назовите его как хотите, ваша" структура папок "- ваша.И S3 хранит его в ведре!

0 голосов
/ 29 апреля 2019

В S3 нет папок.На каждый объект в корзине ссылается его ключ.Однако консоль AWS (и другие клиенты) предпочитают представлять ключ так, как если бы каждый / в ключе действовал как разделитель папок.

Скопировано из S3.putObject () Документация по API (прокрутка вниз):

var params = {
  Bucket: 'STRING_VALUE', /* required */
  Key: 'STRING_VALUE', /* required */
  Body: new Buffer('...') || 'STRING_VALUE' || streamObject,
  // other parameters omitted
};
s3.putObject(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

Прокрутка вниз для получения объяснений:

Body - (Буфер, Typed Array, Blob, String, ReadableStream) Данные объекта.

Bucket - (String) Имя сегмента, для которого была инициирована операция PUT.

Key - (String) Ключ объекта, для которого была инициирована операция PUT.

Переведено params в ваш пример:

var folder = // ...
var subFolder = // ...
var fileName = // ...
var fileContent = // ...

var params = {
  Bucket: bucketName,
  Key: `${folder}/${subFolder}/${fileName}`,
  Body: fileContent
};

Комментарии

  • Как правило, вы никогда не должны хранитьучетные данные (в данном случае accessKeyId и secretAccessKey) как часть вашего исходного кода.В AWS Lambda вы связываете необходимые разрешения, создавая Lambda Execution Role , адаптированную только для создания определенных действий, требуемых исходным кодом Lambda (в вашем примере s3:PutObject для доступа S3 иуправляемая политика arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole для журналов CloudWatch.

  • Вы вызываете s3.createBucket() один раз для каждого события, что означает, что вы (в отличие от вашего объяснения) будете пытаться создать новое ведро для каждогоЛямбда-вызов.

  • Вы вызываете callback(...) до того, как будет вызван обратный вызов s3.putObject(). Следовательно, ваша функция вернется до завершения. Переместите ваш обратный вызов внутриs3.putObject() обратного вызова и убедитесь, что вы вызываете обратный вызов с параметром ошибки, если не удается убедиться, что ваша функция возвращает правильно.

0 голосов
/ 29 апреля 2019

Если вы напрямую загрузите путь, который не существует, S3 создаст папки для вас.

Таким образом, если вы загружаете, например, у вас есть следующая структура

folder --- > subfolder  -->  image

, если при загрузке вы указали путь

/folder/subfolder/image.jpg

S3 автоматически создаст папку и подпапку.

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