使用Multer上传包时希腊字符编码错误问题求助
解决Multer上传希腊字符文件名乱码问题
问题原因
浏览器传递UTF-8编码的文件名(比如希腊字符)时,默认会用latin1编码解析,导致保存后出现乱码(像你遇到的Î Ïξ Îαξ & ÎαÏÏιμιÏαίοι)。你之前在上传完成后修改req.files的方法无效,因为Multer已经用原始乱码文件名完成了文件保存,事后修改不影响已保存的文件。
解决方法
直接在Multer的diskStorage配置的filename回调里完成编码转换,生成正确的UTF-8文件名后再执行保存操作。同时注意在fileFilter里也要先转码再解析扩展名,避免合法文件被误拦截。
修改后的完整代码:
const storage = multer.diskStorage({ destination: function (req, file, callback) { callback(null, './uploads'); }, filename: function (req, file, callback) { // 核心修改:将latin1编码的文件名转成UTF-8 const correctFilename = Buffer.from(file.originalname, 'latin1').toString('utf8'); callback(null, correctFilename); } }); var limits = { files: 100, fileSize: 50000000 }; var upload = multer({ storage: storage, fileFilter: function (req, file, callback) { // 先转码再取扩展名,避免乱码导致解析错误 const correctFilename = Buffer.from(file.originalname, 'latin1').toString('utf8'); var ext = path.extname(correctFilename); if (ext !== '.mp3' && ext !== '.wav' && ext !== '.m4a' && ext !== '.flac' && ext !== '.aac') { return callback(new Error('You can only upload audio files.')) } callback(null, true) }, limits: limits }).any('file');
额外提示
如果你的部署系统对文件名有特殊字符限制,可以在转码后添加文件名清洗逻辑,但希腊字符本身在大多数现代操作系统中都是支持的。
内容的提问来源于stack exchange,提问作者anjel
相关产品推荐
相关产品推荐

