Chargement de l'Image encodée de base64 sur Amazon S3 via un noeud.js

hier j'ai fait une session de codage nocturne profonde et j'ai créé un petit noeud.js / JS (en fait CoffeeScript, mais CoffeeScript est juste JavaScript donc disons JS) app.

Quel est le but?

  1. le client envoie un datauri canvas (png) au serveur (via socket.io)
  2. le serveur télécharge l'image vers amazon s3

l'étape 1 est terminée.

le serveur a maintenant une chaîne de caractères

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACt...

ma question Est: quelles sont mes prochaines étapes pour "stream" / télécharger ces données sur Amazon S3 et créer une image réelle là-bas?

knox https://github.com/LearnBoost/knox semble être une super lib pour mettre quelque chose à S3, mais ce que je manque c'est la colle entre la base64-encoded-image-string et l'action de téléchargement réelle ?

toutes les idées, conseils et commentaires bienvenus.

63
demandé sur ROMANIA_engineer 2011-09-22 11:46:08

2 réponses

Pour les personnes qui sont encore aux prises avec ce problème. Voici l'approche que j'ai utilisée avec les natifs aws-sdk.

var AWS = require('aws-sdk');
AWS.config.loadFromPath('./s3_config.json');
var s3Bucket = new AWS.S3( { params: {Bucket: 'myBucket'} } );

dans votre méthode de routeur :- ContentType doit être défini au type de contenu du fichier image

  buf = new Buffer(req.body.imageBinary.replace(/^data:image\/\w+;base64,/, ""),'base64')
  var data = {
    Key: req.body.userId, 
    Body: buf,
    ContentEncoding: 'base64',
    ContentType: 'image/jpeg'
  };
  s3Bucket.putObject(data, function(err, data){
      if (err) { 
        console.log(err);
        console.log('Error uploading data: ', data); 
      } else {
        console.log('succesfully uploaded the image!');
      }
  });

s3_config.le fichier json est: -

{
  "accessKeyId":"xxxxxxxxxxxxxxxx",
  "secretAccessKey":"xxxxxxxxxxxxxx",
  "region":"us-east-1"
}
131
répondu Divyanshu Das 2014-09-30 02:00:47

ok, celui-ci est la réponse comment enregistrer des données canvas pour Fichier

en gros, ça ressemble à ça dans mon code

buf = new Buffer(data.dataurl.replace(/^data:image\/\w+;base64,/, ""),'base64')


req = knoxClient.put('/images/'+filename, {
             'Content-Length': buf.length,
             'Content-Type':'image/png'
  })

req.on('response', (res) ->
  if res.statusCode is 200
      console.log('saved to %s', req.url)
      socket.emit('upload success', imgurl: req.url)
  else
      console.log('error %d', req.statusCode)
  )

req.end(buf)
15
répondu Franz Enzenhofer 2017-05-23 11:47:18