web-dev-qa-db-fra.com

Comment créer un dossier ou une clé sur s3 à l'aide d'AWS SDK for Node.js?

J'utilise AWS SDK for Node.js pour créer un dossier ou une clé sur s3. J'ai cherché sur google, mais je n'ai rien obtenu. Quelqu'un sait-il comment créer un dossier sous mon compartiment avec AWS SDK for Node.js? et comment pouvez-vous vérifier si ce dossier existe déjà dans votre compartiment?

si tu utilises console.aws.Amazon.com, vous pouvez facilement créer un dossier dans votre compartiment. il semble que je n'ai pas compris comment le créer avec AWS SDK for Node.js?

23
user2896510

S3 n'a pas de dossiers ou de fichiers; il a des seaux et des objets. Les compartiments sont utilisés pour stocker des objets et les objets comprennent des données (qui peuvent être un fichier) et des métadonnées (informations sur les données).

Vous n'avez pas besoin de pré-créer une structure de dossiers dans S3. Vous pouvez simplement mettre un objet avec key = cars/ford/focus.png même si cars/ford/n'existe pas. Dans ce cas:

  • l'appel putObject créera un objet dans cars/ford/focus.png mais il ne créera rien représentant le dossier intermédiaire structure des voitures/gué /.

  • la structure de dossiers réelle n'existe pas, mais est implicite via delimiter=/ lorsque vous appelez listObjects , renvoyant les dossiers dans CommonPrefixes et les fichiers dans Contents.

  • vous ne pourrez pas tester le sous-dossier ford en utilisant headObject car cars/ford/n'existe pas réellement (ce n'est pas un objet). Au lieu de cela, vous avez deux options pour voir s'il existe (logiquement):

    1. appelez listObjects avec prefix = cars/ford/puis trouvez-le dans Contents
    2. appelez listObjects avec prefix = cars /, delimiter =/puis trouvez-le dans CommonPrefixes

Il est cependant possible de créer un objet S3 qui représente un dossier, si vous le souhaitez vraiment. La console AWS S3 le fait, par exemple. Pour créer mon dossier dans un compartiment nommé mybucket, vous pouvez émettre un appel putObject avec bucket = mybucket, key = myfolder/et taille 0. Notez la barre oblique de fin. Dans ce cas:

  • le dossier est en fait un objet de taille nulle dont la clé se termine par /. Notez que si vous laissez de côté /, vous obtiendrez un objet de taille nulle qui semble être un fichier plutôt qu'un dossier.

  • vous pouvez désormais tester la présence de myfolder/subfolder/dans mybucket en émettant un appel headObject avec bucket = mybucket et key = myfolder/subfolder /.

Enfin, notez que votre délimiteur de dossier peut être tout ce que vous aimez, par exemple +, car il fait simplement partie de la clé et n'est pas en fait un séparateur de dossier (il n'y a pas de dossier). Vous pouvez faire varier votre délimiteur de dossier de l'appel listObjects à appeler si vous le souhaitez.

44
jarmod

Le code de @ user2837831 ne semble plus fonctionner, probablement avec la nouvelle version de javascript sdk. J'ajoute donc ici la version du code que j'utilise pour créer un dossier à l'intérieur d'un bucket en utilisant node.js. Cela fonctionne avec le sdk 2.1.31. Ce qui est important, c'est le "/" à la fin de la valeur de clé dans les paramètres - en utilisant cela, il pense que vous essayez de créer un dossier et non un fichier.

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

    }
});
18
Liviu Costea

Un dossier dans un compartiment n'est qu'un autre compartiment. Vous pouvez donc utiliser headBucket pour vérifier s'il existe et le créer avec createBucket si ce n'est pas le cas. Quelque chose comme ça:

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

==== Mise à jour 2017-02-22 ====

Comme indiqué dans le commentaire, c'est une erreur. En 2013, je suppose que cela a entraîné la création d'un "dossier" (en ce qui concerne l'interface utilisateur S3).

Si vous exécutez ce qui précède avec le kit SDK AWS actuel, il créera un objet vide à la clé "folderInBucketA" dans le compartiment "bucketA". Je ne pense pas que cela soit utile à personne donc veuillez ignorer cette réponse.

8
James Skinner

Je trouve que nous n'avons plus besoin d'un appel de création de répertoire explicite.

Juste ce qui suit fonctionne pour moi et crée automatiquement une hiérarchie de répertoires selon mes besoins.

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');
});
6
Nat