
multer 默认对非 ascii 文件名(如希腊字母)解码错误,导致乱码;通过在 filename 函数中将 latin1 编码的原始文件名显式转为 utf-8,即可正确保留希腊字符。
multer 默认对非 ascii 文件名(如希腊字母)解码错误,导致乱码;通过在 filename 函数中将 latin1 编码的原始文件名显式转为 utf-8,即可正确保留希腊字符。
在使用 Multer 处理文件上传时,若客户端以 UTF-8 发送包含希腊字符(如 αβγ.mp3)的文件名,而服务端运行环境(尤其是某些 Node.js 版本或操作系统)未正确识别编码,Multer 的 file.originalname 常被错误解析为 Latin-1(ISO-8859-1)字节流,再按 UTF-8 解码,从而产生类似 αβγ.mp3 的乱码。
根本原因在于:浏览器在表单提交中通常以 UTF-8 编码文件名,但 Multer 底层的 busboy 解析器在某些场景下会将其误判为 Latin-1 字节序列。因此,需在 filename 回调中主动进行编码转换:
const storage = multer.diskStorage({
destination: (req, file, callback) => {
callback(null, './uploads');
},
filename: (req, file, callback) => {
// 关键修复:将 latin1 字节流还原为原始 UTF-8 字符串
const utf8Filename = Buffer.from(file.originalname, 'latin1').toString('utf-8');
callback(null, utf8Filename);
}
});
const limits = {
files: 100,
fileSize: 50000000
};
const upload = multer({
storage,
fileFilter: (req, file, callback) => {
const ext = path.extname(file.originalname).toLowerCase();
const allowedTypes = ['.mp3', '.wav', '.m4a', '.flac', '.aac'];
if (!allowedTypes.includes(ext)) {
return callback(new Error('Only audio files (.mp3, .wav, .m4a, .flac, .aac) are allowed.'));
}
callback(null, true);
},
limits
}).any('file');⚠️ 注意事项:
- 此方案适用于 originalname 已被错误解码为 Latin-1 字符串的场景(表现为希腊字母显示为 α, σ 等),不可用于原本就是 UTF-8 字符串的情况(否则会二次解码出错);
- 若你使用的是较新版本的 Multer(v1.4.5+)且部署在现代 Linux/macOS 环境中,建议先测试是否仍存在乱码——部分环境已默认正确处理 UTF-8 文件名;
- 避免在 req.files[0].originalname = ... 中直接修改,因为 originalname 是只读属性,且该字段已在中间件执行前被解析完毕,应在 filename 函数中统一处理;
- 对于前端,确保 HTML 表单 <form> 显式声明 accept-charset="UTF-8",并检查请求头 Content-Type 是否含 charset=utf-8(尽管 multipart/form-data 不强制要求,但部分客户端依赖此提示)。
该修复简洁、可靠,无需引入额外依赖,是处理 Multer 希腊语/多语言文件名乱码的推荐实践。

















