Express multer上传不起作用

时间:2017-10-28 06:58:47

标签: node.js express multer body-parser

我的上传器有问题。我认为所有代码都是正确的,但仍然没有在uploads文件夹中创建文件。此外,当我尝试console.log(req.files)时,我得到一个空数组。我尝试在本地制作它 这是代码:

const   express = require("express"),
        app = express(),
        multer = require("multer"),
        bodyParser=require("body-parser"),


app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, './uploads/');
    },
    filename: function (req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now() + '.' + mime.extension(file.mimetype));
    }
});

var upload = multer({ storage : storage }).array('userPic');

app.post("/postFormAct", isLoggedIn, function(req, res){
    upload(req,res,function(err) {
        console.log(req.files);
    });
});

还有我的表格:

<form method="post" action="/postFormAct" enctype="multipart/form-data">
    <input type="text" name="user"><br>
    <input type="text" name="email"><br>
    <input type="file" name="userPic"><br>
    <input type="submit" value="Submit">
</form>

3 个答案:

答案 0 :(得分:3)

我认为您的功能级中间件存在问题,您有isLoggedIn,您必须立即将multer中间件upload链接起来:

// ...
var upload = multer({ storage : storage }).array('userPic');

app.post("/postFormAct", isLoggedIn, upload, function(req, res){
    console.log(req.files)
});

这是一个完整的工作例子:

const app = require('express')()
const bodyParser = require('body-parser')
const multer = require('multer')
const morgan = require('morgan')

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads')
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now())
    }
})

const upload = multer({
    storage: storage
})

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(morgan('dev'))

isLoggedIn = (req, res, next) => {
    console.log('check if user is logged in')
    next()
}

app.post('/uploads', isLoggedIn, upload.array('images'), (req, res) => {
    console.log(req.files);
    return res.send(req.files);
})

app.listen(8000, () => {
    console.log(`server is listenning on port 8000`)
})

您可以找到测试存储库here

还要确保您的目的地目录存在。

答案 1 :(得分:1)

而不是var upload = multer({ storage : storage }).array('userPic'); 使用

var upload = multer({ storage : storage }).any('userPic');

<强> .ANY()

接受通过网络传输的所有文件。一系列文件将存储在req.files

答案 2 :(得分:1)

我刚刚发现了一些有关带有 multer 的 Express 中间件的信息。 如果您有多个函数需要充当中间件,则需要将数组作为中间件传递。

所以:

app.post('/uploads', isLoggedIn, upload.array('images'), (req, res) => {
    console.log(req.files);
    return res.send(req.files);
})

应该变成这样:

app.post('/uploads', [upload.array('images'), isLoggedIn], (req, res) => {
    console.log(req.files);
    return res.send(req.files);
})

注意:还要注意上传中间件需要先运行...我不知道为什么会发生这种情况,但这是它对我有用的唯一方法。

如果有人需要这方面的帮助,我只是把它放在那里(即使这个问题很老并且有一个公认的答案)。