Express + MongoDB + multer 解决文件上传 originalname 中文乱码

出现originalname中文乱码,是因为请求时给后端的是 UTF-8 编码的文件名,而后端 Node.js 在解析文件名时,是以 ISO-8859-1 编码来解析的。

一、手动转换编码

在接收到文件后,对文件名进行编码转换。

1. 单文件

javascript 复制代码
// multer配置
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "uploads/"); // 设置文件存储目录
  },
  filename: function (req, file, cb) {
    // 这里假设上传了单个文件
    file.originalname = Buffer.from(file.originalname, "latin1").toString(
      "utf-8"
    );
    cb(null, file.originalname);
  },
});
const upload = multer({ storage: storage });
app.post("/upload", upload.single("file"), (req, res) => {
  // 处理上传后的逻辑,比如将文件信息存入MongoDB
  res.send("文件上传成功");
});

2. 多文件

javascript 复制代码
// multer配置(多文件上传)
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "uploads/");
  },
  filename: function (req, file, cb) {
    // 遍历处理多个文件
    req.files.forEach((singleFile) => {
      singleFile.originalname = Buffer.from(
        singleFile.originalname,
        "latin1"
      ).toString("utf-8");
    });
    cb(null, file.originalname);
  },
});

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

app.post("/upload", upload.array("file", 5), (req, res) => {
  // 处理上传后的逻辑,比如将文件信息存入MongoDB
  res.send("文件上传成功");
});

二、自定义中间件

创建一个中间件来统一处理文件名乱码问题,这样可以在多个路由中复用。

javascript 复制代码
const fixFileNameEncoding = (req, res, next) => {
  if (req.files) {
    if (Array.isArray(req.files)) {
      req.files.forEach((file) => {
        file.originalname = Buffer.from(file.originalname, "latin1").toString(
          "utf-8"
        );
      });
    } else {
      req.files.originalname = Buffer.from(
        req.files.originalname,
        "latin1"
      ).toString("utf-8");
    }
  }
  next();
};
app.post("/upload", upload.single("file"), fixFileNameEncoding, (req, res) => {
  // 处理上传后的逻辑,比如将文件信息存入MongoDB
  res.send("文件上传成功");
});
相关推荐
马克Markorg6 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道10 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075310 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha10 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_10 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance10 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋11 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.11 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库