图片上传:节点Multer'LIMIT_UNEXPECTED_FILE'错误

时间:2017-10-10 20:53:00

标签: node.js express multer

我正在尝试使用multer处理前端到后端的配置文件上传照片,但不断收到此错误:

{ [Error: Unexpected field]
code: 'LIMIT_UNEXPECTED_FILE',
field: 'file',
storageErrors: [] }

以下是我的代码:

register.ejs:

<div class="form-group">
    <input class="form-control" type="file" name="image" id="image">
</div>

ajax.js:

$('form').submit(function(e) {
        e.preventDefault();
        var formData = new FormData(this);
        // var img = cropper.getCroppedCanvas().toDataURL();
        // formData.append('img',img);
            $.ajax({
                url: '/register',
                type: 'POST',
                data: formData,
                processData: false,
                contentType: false,
                success: function () {
                    console.log('Upload success');
                    },
                error: function () {
                    console.log('Upload error');
            }
        });
    });   

app.js:

var multer      = require('multer');
var cloudinary  = require('cloudinary');
...
// MULTER
var storage =   multer.diskStorage({
  destination: function(req, file, callback) {
    callback(null, "./public/uploads");
  },
  filename: function(req, file, callback) {
    callback(null, Date.now() + file.originalname);
  }
});

var upload = multer({ storage : storage}).single("image");

app.post("/register", function(req, res) {
  upload(req, res, function(err){
      if(err) {
           console.log(err);
           return res.send("Error uploading file.");
      }

     res.send("Upload success");
 });
});

当我尝试获取req.body.img或req.file时,我也得到一个未定义的对象。也许formdata没有正确填充?任何人都能为我解释一下吗?

2 个答案:

答案 0 :(得分:0)

multer docs上说,您应该将enctype="multipart/form-data"属性传递给<form>元素。我对ajax并不是很熟悉,但是我认为您可能必须将contentType:中的ajax.js设置为"multiport/form-data"

我也有类似的错误,但这是由于文本字段键不匹配引起的。

答案 1 :(得分:0)

我也遇到了同样的问题,而不是使用

var upload = multer({storage:storage})。single('image');

使用fields()方法允许一次处理多个文件

app.use(multer({storage:storage})。fields([{{name:'image',maxCount:1}])));

文件数据存储在req.files中, 那么您只需处理文件

当您尝试在单个multer中间件中处理多个表单数据对象时发生错误,

您可以使用sycl::id<1>选项将不同的文件存储在不同的位置。

还有更多可以考虑的官方文档