web-dev-qa-db-fra.com

Javascript pour télécharger un fichier à partir du compartiment Amazon s3?

J'essayais de télécharger un fichier à partir d'un compartiment sur Amazon S3. Je me demandais si je pouvais écrire un javascript pour télécharger un tel fichier depuis un seau. Je cherchais sur Google, mais je n'ai trouvé aucune ressource qui puisse m'aider à le faire.

Certaines étapes à l’esprit sont les suivantes: authentifier Amazon S3, puis en fournissant le nom du compartiment et le fichier (clé), télécharger ou lire le fichier afin que je puisse afficher les données dans le fichier.

Merci,

13
c0mrade

Peut-être pouvez-vous utiliser API AWS Node.js

var AWS = require('aws-sdk');
AWS.config.update(
  {
    accessKeyId: ".. your key ..",
    secretAccessKey: ".. your secret key ..",
  }
);
var s3 = new AWS.S3();
s3.getObject(
  { Bucket: "my-bucket", Key: "my-picture.jpg" },
  function (error, data) {
    if (error != null) {
      alert("Failed to retrieve an object: " + error);
    } else {
      alert("Loaded " + data.ContentLength + " bytes");
      // do something with data.Body
    }
  }
);
24
yegor256

Je suis venu ici pour chercher à télécharger un fichier s3 du côté client. Voici comment je l'ai résolu:

En tant que, je ne peux pas stocker mes clés d'authentification s3 côté client, j'ai utilisé mes scripts côté serveur pour générer une URL pré-signée et la renvoyer au client comme:

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'your access key', secretAccessKey: 'you secret key'})

const myBucket = 'bucket-name'
const myKey = 'path/to/your/key/file.extension'
const signedUrlExpireSeconds = 60 * 5 // your expiry time in seconds.

const url = s3.getSignedUrl('getObject', {
 Bucket: myBucket,
 Key: myKey,
 Expires: signedUrlExpireSeconds
})

// return the url to client

Utilisez cette URL dans l'interface frontale pour déclencher le téléchargement:

function download(url){
    $('<iframe>', { id:'idown', src:url }).hide().appendTo('body').click();
}
$("#downloadButton").click(function(){
    $.ajax({
        url: 'example.com/your_end_point',
        success: function(url){
            download(url);
        }
    })
});
10
new_user

D'autres réponses ici fonctionnent, mais je voulais développer ce qui a fonctionné pour moi.

Dans mon cas, j’avais affaire à des fichiers trop volumineux pour 

function download(url){
    $('<iframe>', { id:'idown', src:url }).hide().appendTo('body').click();
}

travailler. (J'obtenais url is too long) Ma solution consistait à inclure une balise d'ancrage masquée et à déclencher le clic sur cette balise en cas de succès du programme ajax. Vous ne pouvez pas utiliser la balise d'ancrage immédiatement, à moins que vous ne vous préoccupiez pas des erreurs de traitement. 

S3 répondra avec un fichier d'erreur XML en cas de problème. Le navigateur affichera alors automatiquement cette réponse XML. En essayant d'abord de frapper l'URL avec ajax, vous pouvez intercepter cette erreur sans afficher le mauvais XML. En cas de succès dans cet appel ajax, vous devez savoir que vous pouvez télécharger le fichier. 

1
cssiamamess