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

Не удается app.use(multer). "требуется функция промежуточного программного обеспечения"

Я только начинаю изучать NodeJS, и у меня проблема. Я хотел бы загрузить файлы на свой сервер. Для этого я искал и узнал этот модуль multer. Выполнение в качестве примера на GitHub:

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

var app = express()

app.post('/uploadImage', upload.single('image'), function(req, res) {
    console.log(req.file);
});

При отправке изображения с FormData на /uploadImage изображение сохраняется в каталоге uploads/. Дело в том, что изображение сохраняется со странным именем, и я хотел бы сохранить его с его оригинальным именем. Для этого я понял, что мне нужно будет вызвать app.use(multer({ dest: 'uploads/' }))', а затем я смогу получить доступ к req.file в моей функции, например:

app.post('/uploadImage', function(req, res) {
    console.log(req.file);
});

Но я получаю сообщение об ошибке при попытке app.use():

TypeError: app.use() requires middleware functions
    at EventEmitter.use (project\node_modules\express\lib\application
.js:209:11)

Im, используя NodeJS 0.12.7 и Express 4.13.1

Как я могу достичь этой загрузки? Благодарю.

4b9b3361

Ответ 1

Вам нужно использовать app.use(multer({dest:'./uploads/'})) в виде одного из них:

app.use(multer({dest:'./uploads/'}).single(...));
app.use(multer({dest:'./uploads/'}).array(...));
app.use(multer({dest:'./uploads/'}).fields(...));

т.е.:

app.use(multer({dest:'./uploads/'}).single('photo'));

И не забудьте что-то вроде:

<form action="/postPhotos" enctype="multipart/form-data" method="post">
    <input type="file" name="photo">
    <input type="submit" value="Upload photo">
</form>

В вашем html.

Ответ 2

var app = require('express');

var multer = require('multer');

app=express();

app.use(multer({dest:__dirname+'/file/uploads/'}).any());

app.post('/upload',function(req,res){

    console.log(req.files);

    res.redirect('/');

});

Ответ 3

Начиная с версии 1.0.0

var upload = multer({ dest: 'tmp/' });
app.post('/file_upload', upload.single('photo'), function (req, res) {

Ответ 4

Ответ от @127.0.0.1 верен, но если вы используете Express Router, код немного изменится:

var express = require('express');
var multer = require('multer');

var router = express.Router();

var uploads = multer({
  dest: 'public/uploads/'
});

router.post('/upload', uploads.single('avatar'), function(req, res, next) {
  console.log(req.file);

  //...
});

И важный бит, кодировка формы должен быть enctype="multipart/form-data", как уже сказано, например:

<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="avatar">
    <input type="submit" value="Go avatar go!">
</form>

Ответ 5

Переход на app.use(multer ({dest: './uploads/'}). single ('photo')); в app.js работает для меня, чтобы запустить сервер

Ответ 6

Я столкнулся с той же проблемой. И я решил это. Для первой проблемы, как получить исходное имя файла? Я напечатал весь запрос и обнаружил, что мы можем получить оригинальное имя, используя путь "Req.file.originalname"

и другой вопрос, как использовать "app.use()"? ссылается: здесь

Ответ 7

Вы не можете изменить имя файла, используя multer, но вы можете использовать Node.js stream и fs module, чтобы скопировать содержимое уже загруженного файла в новый файл (установить как исходное имя файла) в той же папке и удалить старый один.

Прежде всего импортируйте fs, path и multer в node script.

var express = require('express');
var multer = require('multer');
var fs = require('fs');
var pathModule = require('path');

Теперь установите целевой каталог любого типа файлов, используя multer, как показано ниже.

var app = express();
app.use(multer({dest:__dirname+'/resoucres/'}).any());

Теперь используйте поток и fs для решения проблемы.

app.post('/uploadImage', function(request, response) {
    var readerStream = fs.createReadStream(request.files[0].path);
    var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname);
    var writerStream = fs.createWriteStream(dest_file);

    var stream = readerStream.pipe(writerStream);
    stream.on('finish', function(){
        fs.unlink(request.files[0].path);
    });
});