dio post 请求 上传formdata 数据,node 后台接受body为undefind
原因:node 针对formdata 的数据需要特殊处理
两片文章: juejin.cn/post/713564… juejin.cn/post/700064…
关键代码:
1 引入插件multiparty
const express = require('express');
const multiparty = require('multiparty');
const app = express();
const fs = require('fs');
const path = require('path')
const Busboy = require('busboy');
app.get('/', (req, res) => {
res.send('hello, this is a node server for upload file current env is' + process.env.NODE_ENV)
})
// 跨域
app.use(function (req, res, next) {
if (req.method == 'OPTIONS') res.send('OPTIONS PASS')
res.append('Access-Control-Allow-Origin', '*')
res.append('Access-Control-Allow-Methods', 'OPTIONS, GET, PUT, POST, DELETE')
res.append('Access-Control-Allow-Headers', '*')
next();
});
// 上传
app.post('/upload', (req, res) => {
const form = new multiparty.Form();
try {
form.on('part', async function (part) {
if (part.filename) {
// 获取上传路径
const p = await new Promise((resolve, reject) => {
form.on('field', (name, value) => {
resolve(name == 'path'?value:'')
})
})
const saveTo = (process.env.NODE_ENV == 'dev' ? 'D://Temp' : '/usr/static') + (p || '/default')
// 如果不存在文件夹路径则创建文件夹
await new Promise((resolve, reject) => {
fs.stat(saveTo, (err) => {
if (err) {
fs.mkdirSync(saveTo);
}
resolve()
})
})
// 根据路径创建写入流
const writeStrem = fs.createWriteStream(path.join(saveTo, part.filename))
part.pipe(writeStrem)
}
part.on('error', function (err) {
fileStrem.destroy();
});
});
form.parse(req)
} catch (e) {
console.log(e)
res.send('500')
}
res.send('200')
})
app.listen(8010, function () {
console.log('Example app listening on port 8010!\n');
});
2
bookRouter.post('/addBook', passport.authenticate('jwt', { session: false }), (req, res) => {
const uploadDir = path.join(__dirname, '../../public/images'); //设置文件上传路径
const form = new multiparty.Form({
encoding: 'utf-8',
uploadDir
}); //创建和设置上传表单
// 解析表单请求数据
form.parse(req, (error, fields, files) => {
if (error) {
res.status(401).json({
msg:'文件上传失败'
})
throw error;
}
else {
res.json({
fields,
files
})
}
})
})