如何使用 Multer 提交带有可选文件提交的表单?

Posted

技术标签:

【中文标题】如何使用 Multer 提交带有可选文件提交的表单?【英文标题】:How to submit form with Multer with optional file submission? 【发布时间】:2018-01-28 06:33:58 【问题描述】:

我正在使用 multer 在我的 express 应用中提交表单。问题是表单具有可选的图像提交选项。这意味着用户可以根据需要添加照片,但他/她也可以提交不带图像的表单。图片提交没有问题。但是当没有图像时,multer没有提交表单,甚至没有其他字段。

const express = require('express');
const router = express.Router();
const Company = require('../controller/CompanyController');
const multer  = require('multer');
const path = require('path');

let storage = multer.diskStorage(
    destination: function (req, file, cb) 
        cb(null, './public/images/logos');
    ,
    filename: function (req, file, cb) 
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    
);

let upload = multer( storage: storage ).any();

router.route('/companies').post(upload, Company.Create);

module.exports = router;

【问题讨论】:

不要使用.any() 尝试使用.fields([ name: 'avatar', maxCount: 0 ])。我希望这能解决您的问题 问题出在我的控制器级别。手动修复了这个,multer跟它没有关系,我后来才发现的。顺便说一句,谢谢帮助。我用了.array('logo', 1),几乎是一样的东西,但支持多个文件,我以后会用到。 【参考方案1】:

一种解决方法是在提交完成后检查req.file 的值。如果您未在表单中提供文件,req.file 的值应为 undefined。但是,如果您提交文件,它应该是object。因此,您可以像这样编写一个简单的if 语句:

function Create() 
  if (req.file !== undefined) 
  // process image here
  
  // process all other fields

希望对你有帮助!

【讨论】:

非常感谢您的回复。像魅力一样工作。虽然我使用了if(req.files[0]),但我使用的是.array('logo', 1) 方法:) 带我弄清楚这里发生了什么。对于其他任何人,请在此答案的顶部添加“这不是 Multer 相关问题...”。

以上是关于如何使用 Multer 提交带有可选文件提交的表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ajax提交带有输入文件的表单

如何使用 React.js + Django Rest Framework 保存带有表单提交的 blob 文件

如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达

如何使 django 中的 FileField 成为可选的?

如何使用 jQuery 提交带有部分只读输入的表单?

如何使用 ajax 提交带有 3 个提交按钮的表单而不重定向到 Laravel 中的表单操作 url?