Как создать папку или ключ на s3 с помощью AWS SDK для Node.js?
Я использую AWS SDK для Node.js для создания папки или ключа на s3. Я искал в Google, но ничего не получил. Кто-нибудь знает, как я могу создать папку под моим ковшом с AWS SDK для Node.js?
и как вы можете проверить, существует ли эта папка в вашем ковше?
если вы используете console.aws.amazon.com
, вы можете легко создать папку в своем ковше. кажется, я не понял, как создать его с помощью AWS SDK для Node.js?
Ответы
Ответ 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');
});