不能app.use(multer)."需要中间件功能"错误

Joã*_*hin 38 node.js 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);
});
Run Code Online (Sandbox Code Playgroud)

将带有FormData /uploadImage的图像发布到图像时会保存在uploads/目录中.问题是图像以奇怪的名称保存,我想用原始名称保存它.为此,我明白我必须打电话app.use(multer({ dest: 'uploads/' }))' ,然后我将能够访问req.file我的功能,如:

app.post('/uploadImage', function(req, res) {
    console.log(req.file);
});
Run Code Online (Sandbox Code Playgroud)

但是我在尝试app.use()时遇到错误:

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

我使用NodeJS 0.12.7和Express 4.13.1

我怎样才能实现上传?谢谢.

Rub*_*ero 55

您需要以app.use(multer({dest:'./uploads/'}))下列形式之一使用:

app.use(multer({dest:'./uploads/'}).single(...));
app.use(multer({dest:'./uploads/'}).array(...));
app.use(multer({dest:'./uploads/'}).fields(...));
Run Code Online (Sandbox Code Playgroud)

即:

app.use(multer({dest:'./uploads/'}).single('photo'));
Run Code Online (Sandbox Code Playgroud)

并确保有类似的东西:

<form action="/postPhotos" enctype="multipart/form-data" method="post">
    <input type="file" name="photo">
    <input type="submit" value="Upload photo">
</form>
Run Code Online (Sandbox Code Playgroud)

在你的HTML中.


小智 18

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('/');

});
Run Code Online (Sandbox Code Playgroud)

  • 如果它包含对如何回答问题并解决问题的一些解释,那么这个答案就会得到改善. (5认同)
  • ...任何()如此简单:)为我做了魔术感谢Homar (2认同)

Sal*_*lab 8

来自@ 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);

  //...
});
Run Code Online (Sandbox Code Playgroud)

而重要的一点,表格编码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>
Run Code Online (Sandbox Code Playgroud)


Jac*_*cik 6

自版本1.0.0

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

  • 什么是`upload.single('photo')`这里? (2认同)

Adi*_*tya 5

您无法使用multer更改文件名,但可以使用Node.js流和fs模块将已上传文件的内容复制到同一文件夹中的新文件(设置为原始文件名)中,并删除旧文件。

首先,在节点脚本中导入fs,path和multer。

var express = require('express');
var multer = require('multer');
var fs = require('fs');
var pathModule = require('path');
Run Code Online (Sandbox Code Playgroud)

现在,如下所示使用multer设置任何类型的文件的目标目录。

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

现在,使用stream和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);
    });
});
Run Code Online (Sandbox Code Playgroud)