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

Использовать Multer в Express Route? (Использование MEANJS)

Я использую Multer для загрузки изображений в Express 4. Однако все примеры показывают, что Multer определяется в экспресс файле как Middleware. Я бы хотел определить некоторые из поведения Multer в моей маршрутизации приложения. Это возможно? Конечным результатом, который мне нужен, является то, что моя функция маршрута распознает, когда загрузка завершена до того, как он отправит ответ сервера в браузер, так что изображение может быть отображено пользователю (прямо сейчас я получаю только частичное изображение, потому что файл еще не завершил загрузку).

ТЕКУЩИЙ, РАБОЧИЙ КОД

express.js

// Require Multer as module dependency.
var multer = require('multer');

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    }
}));

server_routes.js

app.route('/users/image').post(server_controller_file.imageUpload);

server_controller_file.js

exports.imageUpload = function(req, res) {
// Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response.
};

В идеале, мой server_controller_file.js будет содержать некоторые проверки, чтобы убедиться, что файл завершил загрузку, например. (обратите внимание: это гипотетический/желательный, а не фактический рабочий код)...

var multer = require('multer');
exports.imageUpload = function(req, res) {
    multer({
        onFileUploadComplete: function(file) {
            res.send();
        }
    });
}

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

4b9b3361

Ответ 1

ОК, на самом деле я просто написал исходные данные. Если вы установите inMemory на true, он отправляет необработанные данные в файл req.files.file.buffer. Здесь окончательное, рабочее решение:

express.js

// Using Multer for file uploads.
app.use(multer({
    dest: './public/profile/img/',
    limits: {
        fieldNameSize: 50,
        files: 1,
        fields: 5,
        fileSize: 1024 * 1024
    },
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        console.log('Starting file upload process.');
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            return false;
        }
    },
    inMemory: true //This is important. It what populates the buffer.
}));

server_controller_file.js

exports.imageUpload = function(req, res) {
    var file = req.files.file,
        path = './public/profile/img/';

    // Logic for handling missing file, wrong mimetype, no buffer, etc.

    var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true.
        fileName = file.name;
    var stream = fs.createWriteStream(path + fileName);
    stream.write(buffer);
    stream.on('error', function(err) {
        console.log('Could not write file to memory.');
        res.status(400).send({
            message: 'Problem saving the file. Please try again.'
        });
    });
    stream.on('finish', function() {
        console.log('File saved successfully.');
        var data = {
            message: 'File saved successfully.'
        };
        res.jsonp(data);
    });
    stream.end();
    console.log('Stream ended.');
};

Ответ 2

На самом деле вы можете делать то, что хотите, с помощью другого метода:

var express = require('express');
var multer  = require('multer');
var upload = multer({ dest: './uploads/'});
var app = express();

app.get('/', function(req, res){
  res.send('hello world');
});

// accept one file where the name of the form field is named photho
app.post('/', upload.single('photho'), function(req, res){
    console.log(req.body); // form fields
    console.log(req.file); // form files
    res.status(204).end();
});

app.listen(3000);

Ответ 3

Я нахожу пример для busboy:

exports.upload = function (req, res, next) {
   req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
       // ....
   });

   req.pipe(req.busboy);
};

multer также является каналом для шины:

 req.pipe(busboy);

https://github.com/expressjs/multer/blob/master/index.js#206