【问题标题】:Express multer upload doesnt workExpress multer上传不起作用
【发布时间】:2018-04-09 18:33:42
【问题描述】:

我的上传器有问题。我认为所有带有代码的东西都是正确的,并且文件仍然没有在上传文件夹中创建。此外,当我尝试 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>

【问题讨论】:

  • 一旦我添加了缺少的依赖项mimeisLoggedIn,你的代码就对我有用,尽管我认为它们对你来说并没有丢失。您是否尝试过记录err 以确认没有错误?您是否尝试过将日志记录到您的 destinationfilename 函数中以查看它们是否被调用?可能是文件系统权限问题吗?您是否尝试过使用绝对路径而不是相对路径?
  • 我试过记录,没有任何错误。也许表单有问题,因为我尝试了每一个解决方案,每次我得到一个空数组或未定义的 req.files
  • 你的表单很不错,但只需在提交和检查上方添加另一个&lt;input type="file" name="userPic"&gt;&lt;br&gt;。代码没有问题。我已经执行了你的代码并且它为我工作。仅出于测试目的删除 isLoggedIn 并执行代码。
  • 好的,问题是其他模块阻止 multer 工作。现在它固定了。感谢您的帮助

标签: node.js express multer body-parser


【解决方案1】:

我认为你的功能级中间件有问题,你有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

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

【讨论】:

  • 我试图复制粘贴该工作示例,甚至此代码也没有将图像放在我的上传文件夹中,当我尝试控制台日志 req.files 它仍然是一个空数组
  • 好的,问题是其他模块阻止 multer 工作。现在它固定了。感谢您的帮助
  • @rafalos - 哪个模块阻止 multer 工作? GridFS 有没有机会?
【解决方案2】:

我刚刚发现了一些关于带有 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);
})

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

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

【讨论】:

    【解决方案3】:

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

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

    .any()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 2015-03-09
      • 2021-10-17
      • 2019-09-30
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      相关资源
      最近更新 更多