Не удается 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
Как я могу достичь этой загрузки? Благодарю.
Ответы
Ответ 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);
});
});