Node.js Express4单输入框多文件上传:单文件上传失败求解
问题分析与解决方案
这个问题的核心原因是express-fileupload中间件的处理逻辑差异:当你上传单个文件时,req.files.attach_file返回的是一个单独的文件对象,而不是数组;只有上传多个文件时,它才会返回一个文件数组。这就导致你单文件上传时,sampleFile.length输出undefined,而且sampleFile.forEach也会因为对象没有这个方法而失效。
修复步骤
- 统一单/多文件的数据格式:在服务端先判断
sampleFile是否为数组,如果不是,就把它包装成只有一个元素的数组,这样后续的遍历逻辑可以统一处理。 - 完善错误处理:原来的
if (!req.files)判断后要加上return,避免后续代码继续执行导致报错。
修改后的服务端代码
router.post('/send_message', function(req, res, next){ if (!req.files) { // 加上return,防止后续代码执行引发错误 return res.json('No files were uploaded.'); } let sampleFile = req.files.attach_file; // 处理单文件情况,转为数组格式 if (!Array.isArray(sampleFile)) { sampleFile = [sampleFile]; } console.log(sampleFile.length); // 现在单文件时输出1,多文件时输出对应数量 var file_info = []; var count = 0; sampleFile.forEach(function(ele, key) { ele.mv(path.resolve(`./public/upload/${ele.name}`), function(err) { if (err){ console.log(err); }else{ file_info.push(ele.name); } count++; if(sampleFile.length == count){ res.json({file_name: file_info }); } }); }); });
前端代码说明
你的前端AJAX代码是没问题的:不管单文件还是多文件,都会通过$.each循环把文件append到FormData里。即使是单文件,$('#msg_file')[0].files也是一个长度为1的FileList,所以$.each会执行一次,正确append单个文件到FormData中。
内容的提问来源于stack exchange,提问作者Mahfuzur Rahman
相关产品推荐
相关产品推荐

