dio post 请求 上传formdata 数据,node 后台接受body为undefind

428 阅读1分钟

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
            })
        }
    })
})