node.js实现文件上传

188 阅读1分钟

使用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字段下存放请求数据

image-20220824173350801.png

fieldsfiles内容

{
    "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];
                }