Node.js Multer无法通过FormData保存上载的文件
我无法将通过VueJS前端发送的上传文件保存到Node+Express后端。数据通过多部分表单数据从前端发送,因此所有元数据和文件本身都附加在请求主体中。以下是后端上的路由器Node.js Multer无法通过FormData保存上载的文件,node.js,vue.js,express,multer,Node.js,Vue.js,Express,Multer,我无法将通过VueJS前端发送的上传文件保存到Node+Express后端。数据通过多部分表单数据从前端发送,因此所有元数据和文件本身都附加在请求主体中。以下是后端上的路由器 import {submitFlag} from '../some/dir/controller.js' const router = express.Router(); const app = express(); app.use(express.json()); router.post('/submit-flag
import {submitFlag} from '../some/dir/controller.js'
const router = express.Router();
const app = express();
app.use(express.json());
router.post('/submit-flag', [], submitFlag)
以及处理来自路由器的API请求的后端控制器
import multer from 'multer';
const evidencePathSave = '../uploads/flagEvidence'
export const submitFlag = async (req, res) => {
const evidenceStorage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, evidencePathSave)
},
filename: function (req, file, cb) {
cb(null, req.body.flagEvidence.name);
}
})
const uploadEvidence = multer({
storage: evidenceStorage,
fileFilter: (req, res, cb) => {
const filetypes = /pdf|doc|docx|txt/;
const mimetype = filetypes.test(req.body.flagEvidence.type);
const extname = filetypes.test(path.extname(req.body.flagEvidence.name));
// if mimetype && extname are true, then no error
if(mimetype && extname){
return cb(null, true);
}
// if mimetype or extname false, give an error of compatibilty
return cb("The uploaded file, isn't compatible");
}
}).fields([
{name: 'flagEvidence', maxCount: 1}
]);
uploadEvidence(req, res, function(err) {
if (err) {
console.log(err)
res.status(500).send("Error in Saving");
}
})
res.status(200)
}
该函数不返回任何错误或状态500消息,但在检查本地存储时,似乎在任何地方都找不到该文件。删除文件过滤器功能似乎不起作用
前端Vue功能如下所示
submitFlag(event) {
this.flagEvidence = event.target.files[0]
var formData = new FormData()
formData.append('flagSubject', this.flagSubject)
formData.append('flagWriteup', this.flagWriteup)
formData.append('flagEvidence', this.flagEvidence)
formData.append('userID', this.user._id)
formData.append('username', this.user.username)
formData.append('publicationID', this.publicationID)
formData.append('filename', this.flagEvidence.name)
axios({
method: "POST",
url: serverSide.submitFlag,
data: formData,
headers: {"Content-type": "multipart/form-data"}
})
.then((res) => {
this.$router.push({name: "news", query:{id: this.publicationID}})
})
.catch(function (error) {
console.error(error.response);
});
}
你对multer的使用不正确
multer.fields()
返回应作为中间件传递到路由的函数。以下是您的案例中的情况:
const-evidenceStorage=multer.diskStorage({
目标:函数(req,文件,cb){…},
文件名:函数(请求、文件、cb){
cb(null,file.originalname);
},
});
const uploadEvidence=multer({
存储:证据存储,
fileFilter:(请求、res、cb)=>{…},
);
转发器(
“/submit标志”,
uploadEvidence.fields([{name:'flagEvidence',maxCount:1}]),
提交标签
);
另外,在配置DiskStorage
时,我会使用file.originalname
而不是req.body.flagEvidence.name
。在Node.js中使用文件上载时,请查看此免费版本