Formidable PUT请求报错:上传文件至NodeJS服务器遇Content-Type异常
我来帮你拆解这个问题——image/jpeg确实是标准的MIME类型,触发这个报错肯定是服务器端或者请求细节上出了疏漏,下面是几个最常见的原因:
上传中间件的白名单没包含image/jpeg
大部分Node.js文件上传中间件(比如multer、express-fileupload)都需要你明确指定允许的文件类型。如果你的代码里配置了fileFilter这类过滤规则,但漏掉了image/jpeg,中间件就会把它判定为未知类型抛出错误。比如用multer时,要是你的过滤函数只允许image/png和image/jpg,那image/jpeg就会被拦截。请求头的Content-Type格式有异常
虽然image/jpeg本身有效,但如果客户端发送的请求头里带了多余内容(比如image/jpeg; charset=utf-8)、空格(比如image/ jpeg),或者大小写不符合中间件的识别逻辑(比如Image/JPEG),某些严格的中间件可能无法正确解析,从而报错。中间件版本存在兼容性bug
如果你用的是旧版本的上传中间件,可能存在MIME类型识别的遗漏问题。比如早期版本的multer对部分标准MIME类型的支持不全,升级到最新版本大概率能解决这类问题。请求体的格式有问题
上传文件必须确保表单的enctype属性设置为multipart/form-data,如果没设置这个,服务器端的中间件可能无法正确解析文件的Content-Type,甚至把整个请求体识别错误,导致误判类型。
举个multer的正确配置例子,确保image/jpeg被允许:
const multer = require('multer'); const storage = multer.diskStorage({ destination: (req, file, cb) => cb(null, './uploads/'), filename: (req, file, cb) => cb(null, `${Date.now()}-${file.originalname}`) }); const fileFilter = (req, file, cb) => { const allowedTypes = ['image/jpeg', 'image/png', 'image/jpg']; if (allowedTypes.includes(file.mimetype)) { cb(null, true); } else { cb(new Error(`bad content-type header, unknown content-type: ${file.mimetype}`), false); } }; const upload = multer({ storage, fileFilter });
内容的提问来源于stack exchange,提问作者Tobiq

