Простой способ загрузить изображение с помощью node.js и выразить?

Я нашел несколько статей, объясняющих процесс, но большинство из них устарели. Как вы обрабатываете загрузку изображений в node.js?


person Artur Stary    schedule 30.10.2014    source источник


Ответы (3)


Я использую промежуточное ПО busboy в экспресс-разборе изображений в запросе multipart/form-data, и это работает довольно мило.

Мой код выглядит примерно так:

const busboy = require('connect-busboy');
//...
app.use(busboy());

app.use(function parseUploadMW(req,res,next){
  req.busboy.on('file', function onFile(fieldname, file, filename, encoding, mimetype) {
    file.fileRead = [];
    file.on('data', function onData(chunk) {
      this.fileRead.push(chunk);
    });
    file.on('error', function onError(err) {
      console.log('Error while buffering the stream: ', err);
      //handle error
    });
    file.on('end', function onEnd() {
      var finalBuffer = Buffer.concat(this.fileRead);
      req.files = req.files||{}
      req.files[fieldname] = {
        buffer: finalBuffer,
        size: finalBuffer.length,
        filename: filename,
        mimetype: mimetype.toLowerCase()
      };
    });
  });
  req.busboy.on('finish', function onFinish() {
    next()
  });
  req.pipe(req.busboy);
})

Тогда файлы будут в объекте req для вас в req.files ваших экспресс-маршрутах.

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

Еще один популярный и достойный пакет: https://github.com/andrewrk/node-multiparty.

person mattr    schedule 30.10.2014
comment
Спасибо, я проверю это - person Artur Stary; 31.10.2014

Я использую multer, и он отлично работает. Он хранит ваше изображение локально. Вы также можете отправить его в mongodb, если хотите. Вот как я это делаю.

var multer  = require('multer');
var done    = false;

//define the model you are working with*
var Slides = require('./models/work');

app.use(multer({
    dest: './public/img',
    rename: function (fieldname, filename) {
        return filename+Date.now();
    },

    onFileUploadStart: function (file) {
        console.log(file.originalname + ' is starting ...')
    },

    onFileUploadComplete: function (file) {
        console.log(file.fieldname + ' uploaded to  ' + file.path);
        done = true;
        var id= file.fieldname;
        var str = file.path;
        var image = str.replace('public', '');

        var slidegegevens = {
            "id": id,
            "img": image
        };

        var s = new Slides(slidegegevens);
        s.save(function (err, slidegegevens) {
            console.log(err);
            console.log('slidegegevens: ' + slidegegevens);
        }); 
    }
}));
person Sara Barrera Riano    schedule 15.05.2015

Я думаю, что для обработки входящих изображений лучше использовать formidable.

person RikyTres    schedule 31.10.2014