Подтвердить что ты не робот

Как загрузить файл из браузера в Amazon S3 с помощью node.js, Express и knox?

Я пытаюсь найти пример кода, который использует node.js, Express и knox.

Документы для Knox дают только ясные примеры того, как загрузить файл, уже сохраненный в файловой системе. https://github.com/learnboost/knox#readme

Кроме того, существует ряд простых обучающих программ (даже в самом Экспрессе) о том, как загружать файлы напрямую, чтобы выразить и сохранить в файловой системе.

У меня возникли проблемы с поиском - это пример, который позволяет загружать клиентскую загрузку на сервер node и передавать данные непосредственно на S3, а не сначала хранить в локальной файловой системе.

Может ли кто-нибудь указать мне сущность или другой пример, содержащий эту информацию?

4b9b3361

Ответ 1

Все предыдущие ответы связаны с загрузкой через ваш сервер node.js, который неэффективен и не нужен. Ваш сервер node не должен обрабатывать пропускную способность или обработку загруженных файлов, поскольку Amazon S3 позволяет загружать прямо из браузера.

Взгляните на это сообщение в блоге: http://blog.tcs.de/post-file-to-s3-using-node/

Я не пробовал код, указанный там, но, просмотрев его, он выглядит солидным, и я буду пытаться его реализовать. Вскоре объявление будет обновлять этот ответ моими выводами.

Ответ 2

Вот пример потоковой передачи непосредственно на s3, не касаясь вашего жесткого диска, используя multiparty и 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+'/');
});

пример, взятый из https://github.com/superjoe30/node-multiparty/blob/master/examples/s3.js

Ответ 3

код node/express не работает с nodejs v0.4.7

здесь приведен обновленный код для 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
  });
});

Ответ 4

* обновление *

по состоянию на середину 2009 года amazon поддерживает CORS, и загрузка с вашего сервера node.js больше не нужна. вы можете напрямую загрузить файл на S3.


с помощью модуля "connect-form" вы можете просто загрузить файл на свой сервер (через стандартную многочастную ФОРМУ), а затем обработать материал S3 потом...

<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>

node/экспресс-код:

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

вам нужно добавить следующую строку в конфигурацию приложения:

app.configure(function(){
  // rest of the config stuff ...
  app.use(form({ keepExtensions: true }));
  // ...
});

Ответ 5

Библиотека connect-stream-s3 может загружать все ваши файлы форм на S3 как часть промежуточного программного обеспечения, поэтому вам не нужно самостоятельно выполнять какую-либо логику. Для этого он должен работать express.bodyParser(), но я работаю над версией, которая будет передавать файлы прямо на Amazon S3 перед записью на диск:

Пожалуйста, дайте мне знать, как вы справляетесь. Надеюсь, это намного меньше хлопот, чем делать это самостоятельно, как только вы находитесь в своем обработчике страниц.:)

Ответ 6

Я сделал это для загрузки непосредственно из модуля загрузки файлов Jquery на S3 с открытым файлом - он должен указать вам в правильном направлении.

https://gist.github.com/3995819