Comment télécharger un fichier à partir du navigateur vers Amazon S3 avec node.js, Express, et knox? [fermé]

J'essaie de trouver un exemple de code qui utilise nœud.js, Express, et knox.

Les documents pour Knox ne donnent que des exemples clairs de la façon de télécharger un fichier déjà stocké dans le système de fichiers. https://github.com/learnboost/knox#readme

En outre, il y a un certain nombre de tutoriels simples (même dans Express lui-même) sur la façon de télécharger des fichiers directement à express et enregistrer dans le système de fichiers.

Ce que j'ai du mal à trouver est un exemple qui vous permet de télécharger un client téléchargez sur un serveur de nœud et faites diffuser les données directement sur S3 plutôt que de les stocker dans le système de fichiers local en premier.

Quelqu'un peut-il me diriger vers un essentiel ou un autre exemple qui contient ce genre d'information?

21
demandé sur Geuis 2011-07-21 13:47:29

6 réponses

Toutes les réponses précédentes impliquent que le téléchargement passe par votre nœud.serveur js qui est inefficace et inutile. Votre serveur de nœud n'a pas à gérer la bande passante ou le traitement des fichiers téléchargés, car Amazon S3 permet les téléchargements directement depuis le navigateur .

Jetez un oeil à ce billet de blog: http://blog.tcs.de/post-file-to-s3-using-node/

Je n'ai pas essayé le code répertorié ici, mais après l'avoir regardé, il semble solide et je tentera une mise en œuvre de celui-ci bientôt ad mettra à jour cette réponse avec mes conclusions.

13
répondu talentedmrjones 2012-08-18 18:17:29

Voici un exemple de streaming directement sur s3 sans jamais toucher votre disque dur, en utilisant multiparty et knox :

var http = require('http')
  , util = require('util')
  , multiparty = require('multiparty')
  , knox = require('knox')
  , Batch = require('batch')
  , PORT = process.env.PORT || 27372

var s3Client = knox.createClient({
  secure: false,
  key: process.env.S3_KEY,
  secret: process.env.S3_SECRET,
  bucket: process.env.S3_BUCKET,
});

var Writable = require('readable-stream').Writable;
util.inherits(ByteCounter, Writable);
function ByteCounter(options) {
  Writable.call(this, options);
  this.bytes = 0;
}

ByteCounter.prototype._write = function(chunk, encoding, cb) {
  this.bytes += chunk.length;
  cb();
};

var server = http.createServer(function(req, res) {
  if (req.url === '/') {
    res.writeHead(200, {'content-type': 'text/html'});
    res.end(
      '<form action="/upload" enctype="multipart/form-data" method="post">'+
      '<input type="text" name="path"><br>'+
      '<input type="file" name="upload"><br>'+
      '<input type="submit" value="Upload">'+
      '</form>'
    );
  } else if (req.url === '/upload') {
    var headers = {
      'x-amz-acl': 'public-read',
    };
    var form = new multiparty.Form();
    var batch = new Batch();
    batch.push(function(cb) {
      form.on('field', function(name, value) {
        if (name === 'path') {
          var destPath = value;
          if (destPath[0] !== '/') destPath = '/' + destPath;
          cb(null, destPath);
        }
      });
    });
    batch.push(function(cb) {
      form.on('part', function(part) {
        if (! part.filename) return;
        cb(null, part);
      });
    });
    batch.end(function(err, results) {
      if (err) throw err;
      form.removeListener('close', onEnd);
      var destPath = results[0]
        , part = results[1];

      var counter = new ByteCounter();
      part.pipe(counter); // need this until knox upgrades to streams2
      headers['Content-Length'] = part.byteCount;
      s3Client.putStream(part, destPath, headers, function(err, s3Response) {
        if (err) throw err;
        res.statusCode = s3Response.statusCode;
        s3Response.pipe(res);
        console.log("https://s3.amazonaws.com/" + process.env.S3_BUCKET + destPath);
      });
      part.on('end', function() {
        console.log("part end");
        console.log("size", counter.bytes);
      });
    });
    form.on('close', onEnd);
    form.parse(req);

  } else {
    res.writeHead(404, {'content-type': 'text/plain'});
    res.end('404');
  }

  function onEnd() {
    throw new Error("no uploaded file");
  }
});
server.listen(PORT, function() {
  console.info('listening on http://0.0.0.0:'+PORT+'/');
});

Exemple tiré de https://github.com/superjoe30/node-multiparty/blob/master/examples/s3.js

4
répondu andrewrk 2013-04-05 09:54:33

Le code node / express ne fonctionne pas avec nodejs v0.4. 7

Voici le code mis à jour pour nodejs v0.4. 7

app.post('/upload', function (req, res) {
  // connect-form additions
  req.form.complete(function (err, fields, files) {
    // here lies your uploaded file:
    var path = files['upload-file']['path'];
    // do knox stuff here
  });
});
1
répondu heisthedon 2011-08-11 14:48:21

* mise à jour *

À partir de la mi-2009, amazon prend en charge CORS et le téléchargement via votre nœud.le serveur js n'est plus nécessaire. vous pouvez directement télécharger le fichier sur S3.


Avec l'aide du module "connect-form", vous pouvez simplement télécharger le fichier sur votre serveur (via un formulaire multipart normal), puis Gérer les fichiers S3 par la suite ...

<form action="/upload" method="POST" id="addContentForm" enctype="multipart/form-data">
  <p><label for="media">File<br/><input type="file" name="media" /></label></p>
  <p><button type="submit">upload</button></p>
</form>

Code noeud / express:

app.post('/upload', function (req, res) {
  // connect-form additions
  req.form.complete(function (err, fields, files) {
    // here lies your uploaded file:
    var path = files['media']['path'];
    // do knox stuff here
  });
});

, Vous devez ajouter la ligne suivante à la configuration de l'application:

app.configure(function(){
  // rest of the config stuff ...
  app.use(form({ keepExtensions: true }));
  // ...
});
0
répondu pkyeck 2013-04-06 09:08:48

La bibliothèque connect-stream-s3 peut télécharger tous vos fichiers de formulaires vers S3 dans le cadre d'un middleware afin que vous n'ayez pas à faire de logique vous-même. Il a besoin d'exprimer.bodyParser() pour que cela fonctionne en ce moment, mais je travaille sur une version qui diffusera des fichiers directement sur Amazon S3 avant d'être écrit sur le disque:

Faites-moi savoir comment vous vous en sortez. J'espère que c'est beaucoup moins compliqué que de le faire vous même une fois vous êtes dans votre gestionnaire de page. :)

-1
répondu chilts 2012-05-05 04:43:58

J'ai fait cela pour télécharger directement à partir du plugin de téléchargement de fichier Jquery vers S3 avec le fichier étant public - il devrait vous diriger dans la bonne direction.

Https://gist.github.com/3995819

-1
répondu cyberwombat 2012-11-01 19:22:16