使用multiparty实现node文件上传
一、 下载
npm i multiparty -S
二、 引入
const multiparty = require('multiparty');
三、 在路由中使用
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
})
}
})
})
postman发起请求 注意在body的form-data字段下存放请求数据
fields和files内容
{
"msg": "成功存储",
"files": {
"bookCover": [
{
"fieldName": "bookCover",
"originalFilename": "b89424a5b093c3711bb1e5c5e28d462c.jpeg",
"path": "C:\\Users\\27843\\Desktop\\图书管理系统\\api\\public\\images\\OtTle7yaMp92m6WtMhaHrIK4.jpeg",
"headers": {
"content-disposition": "form-data; name=\"bookCover\"; filename=\"b89424a5b093c3711bb1e5c5e28d462c.jpeg\"",
"content-type": "image/jpeg"
},
"size": 120640
}
]
},
"fields": {
"bookName": [
"google"
]
}
}
除了文件名以外其他值都存放在fields中
四、 在存放文件时默认文件名是随机产生的,可以改写文件名
bookRouter.post('/addBook', passport.authenticate('jwt', { session: false }), (req, res) => {
const rights = req.user.rights;
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 {
const oldPath = files.bookCover[0].path; //这里的bookCover是由于发起请求时form-data的key是bookCover
const newPath = uploadDir + '/' + fields.bookName[0] + '.jpeg'; //新文件路径
fs.renameSync(oldPath, newPath);
res.json({
msg: '成功存储',
files,
fields
})
}
})
})
对fields数据处理
let book = {}
for (let key in fields) {
book[key] = fields[key][0];
}