Подтвердить что ты не робот

Как создать папку или ключ на s3 с помощью AWS SDK для Node.js?

Я использую AWS SDK для Node.js для создания папки или ключа на s3. Я искал в Google, но ничего не получил. Кто-нибудь знает, как я могу создать папку под моим ковшом с AWS SDK для Node.js? и как вы можете проверить, существует ли эта папка в вашем ковше?

если вы используете console.aws.amazon.com, вы можете легко создать папку в своем ковше. кажется, я не понял, как создать его с помощью AWS SDK для Node.js?

4b9b3361

Ответ 1

S3 не имеет папок или файлов; у него есть ведра и предметы. Ковши используются для хранения объектов, а объекты содержат данные (которые могут быть файлом) и метаданные (информация о данных).

Вам не нужно предварительно создавать структуру папок в S3. Вы можете просто поместить объект с ключом = cars/ford/sedans/focus.png, даже если car/ford/sedans/не существует. В этом случае:

  • вызов putObject создаст объект в автомобилях /ford/sedans/focus.png, но он не создаст ничего, представляющего промежуточную структуру папок для автомобилей /ford/sedans/.

  • фактическая структура папок не существует, но подразумевается с помощью использования delimiter =/в ваших вызовах listObjects, и папки будут возвращены в CommonPrefixes, в то время как файлы будут возвращены в Содержание.

  • вы не сможете протестировать подпапку седанов с помощью headObject, потому что cars/ford/sedans/фактически не существует (это не объект). Вместо этого у вас есть два варианта, чтобы увидеть, существует ли это (логически):

    • call listObjects с префиксом = cars/ford/sedans/, а затем найти его в содержании или
    • call listObjects with prefix = cars/ford/, delimiter =/, а затем найти его в CommonPrefixes.

Тем не менее, можно создать объект S3, который представляет собой папку, если вы действительно этого хотите. Чтобы создать мою папку в ковше с именем mybucket, вы можете выдать вызов putObject с помощью bucket = mybucket, key = myfolder/и size 0. Обратите внимание на конечную косую черту. В этом случае:

  • папка на самом деле представляет собой объект с нулевым размером, ключ которого заканчивается на /. Обратите внимание, что если вы оставите конечный результат, то вы получите объект нулевого размера, который выглядит как файл, а не папка.

  • вы теперь можете протестировать наличие моей папки/подпапки/в mybucket, выпустив вызов headObject с помощью bucket = mybucket и key = myfolder/subfolder/.

Наконец, обратите внимание, что ваш разделитель папок может быть любым, например, +, потому что он просто является частью ключа и на самом деле не является разделителем папок (нет папок). Вы можете изменить свой разделитель папки из вызова listObjects для вызова, если хотите.

Ответ 2

Код из @user2837831 больше не работает, возможно, с новой версией javascript sdk. Поэтому я добавляю здесь версию кода, которую я использую, чтобы создать папку внутри ведра с помощью node.js. Это работает с 2.1.31 sdk. Важно то, что "/" в конце значения Key в params - используя, что он думает, что вы пытаетесь создать папку, а не файл.

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var s3Client = new AWS.S3();

var params = { Bucket: 'your_bucket_goes_here', Key: 'folderInBucket/', ACL: 'public-read', Body:'body does not matter' };

s3Client.upload(params, function (err, data) {
if (err) {
    console.log("Error creating the folder: ", err);
    } else {
    console.log("Successfully created a folder on S3");

    }
});

Ответ 3

Папка в ковше - это еще одно ведро. Поэтому вы можете использовать headBucket, чтобы проверить, существует ли он и создать его с помощью createBucket, если это не так. Что-то вроде этого:

var AWS = require('aws-sdk'),
    s3 = new AWS.S3(),
    bucketFolder = 'bucketA/folderInBucketA';

s3.headBucket({Bucket:bucketFolder},function(err,data){
    if(err){
        s3.createBucket({Bucket:bucketFolder},function(err,data){
            if(err){ throw err; }
            console.log("Bucket created");
        });
     } else {
         console.log("Bucket exists and we have access");
     }
});

==== Обновление 2017-02-22 ====

Как отмечалось в комментарии, это не работает. В 2013 году я предполагаю, что это привело к созданию "папки" (насколько это касается интерфейса S3).

Если вы запустили выше с помощью текущего AWS SDK, он создаст пустой объект в ключе "folderInBucketA" в ведро "bucketA". Я не думаю, что это полезно для всех, поэтому не обращайте внимания на этот ответ.

Ответ 4

Я обнаружил, что нам больше не нужен явный вызов создания каталогов.

Просто для меня работает следующее и автоматически создает иерархию каталогов по мере необходимости.

var userFolder = 'your_bucket_name' + '/' + variable-with-dir-1-name + '/' + variable-with-dir-2-name;
// IMPORTANT : No trailing '/' at the end of the last directory name

AWS.config.region = 'us-east-1';

AWS.config.update({
    accessKeyId: 'YOUR_KEY_HERE',
    secretAccessKey: 'your_secret_access_key_here'
});

var bucket = new AWS.S3({
    params: {
        Bucket: userFolder
    }
});

var contentToPost = {
    Key: <<your_filename_here>>, 
    Body: <<your_file_here>>,
    ContentEncoding: 'base64',
    ContentType: <<your_file_content_type>>,
    ServerSideEncryption: 'AES256'
};

bucket.putObject(contentToPost, function (error, data) {

    if (error) {
        console.log("Error in posting Content [" + error + "]");
        return false;
    } /* end if error */
    else {
        console.log("Successfully posted Content");
    } /* end else error */
})
.on('httpUploadProgress',function (progress) {
    // Log Progress Information
    console.log(Math.round(progress.loaded / progress.total * 100) + '% done');
});