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

node.js amazon-web-services sdk

36216 просмотра

4 ответа

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

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

Источник Размещён: 12.11.2019 09:25

Ответы (4)


48 плюса

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

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

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

  • фактическая структура папок не существует, но подразумевается, delimiter=/когда вы вызываете listObjects , возвращая папки CommonPrefixesи файлы в Contents.

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

    1. вызовите listObjects с префиксом = cars / ford /, а затем найдите его в Contents
    2. вызовите listObjects с префиксом = cars /, delimiter = / и затем найдите его в CommonPrefixes

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

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

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

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

Автор: jarmod Размещён: 30.07.2015 03:42

19 плюса

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

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");

    }
});
Автор: Liviu Costea Размещён: 28.05.2015 12:38

8 плюса

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

Автор: James Skinner Размещён: 30.10.2013 10:48

6 плюса

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

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

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');
});
Автор: Nat Размещён: 24.07.2015 06:12
Вопросы из категории :
32x32