Я нашел несколько статей, объясняющих процесс, но большинство из них устарели. Как вы обрабатываете загрузку изображений в node.js?
Простой способ загрузить изображение с помощью node.js и выразить?
Ответы (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 а>.
Я использую 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);
});
}
}));
Я думаю, что для обработки входящих изображений лучше использовать formidable
.