解决nodejs+express+multer保存中文文件名乱码

1,081 阅读1分钟

省流

在使用multer()函数时除了storage{}对象还需要多传一个fileFilter()函数。

// 配置 Multer 中间件,指定文件上传的目标文件夹
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, "uploads/"); // 这里指定上传文件保存的目录,确保该目录存在
    },
    filename: (req, file, cb) => {
        cb(null, file.originalname);
    }
});
// 声明fileFilter函数
const fileFilter = (req, file, callback) => {
    // 解决中文名乱码的问题 latin1 是一种编码格式
    file.originalname = Buffer.from(file.originalname, "latin1").toString(
        "utf8"
    );
    callback(null, true);
};

const upload = multer({storage: storage, fileFilter: fileFilter});

代码

const express = require("express");

const router = express.Router();

const multer = require("multer");

// 配置 Multer 中间件,指定文件上传的目标文件夹
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, "uploads/"); // 这里指定上传文件保存的目录,确保该目录存在
    },
    filename: (req, file, cb) => {
        cb(null, file.originalname);
    }
});

const fileFilter = (req, file, callback) => {
    // 解决中文名乱码的问题 latin1 是一种编码格式
    file.originalname = Buffer.from(file.originalname, "latin1").toString(
        "utf8"
    );
    callback(null, true);
};

const upload = multer({storage: storage, fileFilter: fileFilter});

router.post("/upload/files", upload.single("file"), (req, res) => {
    res.json({message: "文件上传成功!"});
});

module.exports = router;