问题描述
今天在菜鸟教程学习node上传文件时遇到了一个中文乱码的问题,文件名包含中文就会显示乱码,上传到服务器的文件名也是乱码。试了两个方法都不行,最后还是问了万能的度娘才解决。
我做了一个非常简单的上传文件的界面,
- 第一步选择文件
- 第二步点击上传文件,上传到node后端服务
上传文件的界面
- node后端服务会上传文件,上传成功后会把文件名返回前端显示出来,这时候就会显示乱码了
node上传文件代码
app.post('/file_upload', function(req, res) {// req.files[0].originalname是获取到的文件名,这时候已经是乱码了var des_file = __dirname + "/" + req.files[0].originalname;fs.readFile(req.files[0].path, function(err, data){// 文件写入fs.writeFile(des_file, data, function(err) {var response = {}if(err) {console.error(err);} else {// 上传成功,返回前端消息response = {message: 'File uploaded successfully',filename: req.files[0].originalname}}res.end(JSON.stringify(response));})})
})
解决过程
在文章底下别人的笔记里面看到了关于这个问题的两个解决方案,决定尝试一下,尝试过后发现还是会乱码,不知道为什么,总之这两个方案都没有能解决我的问题。
最终解决方案
后来去问了度娘,看到了一个比较靠谱的解决方案,决定尝试一下。
加上这段代码后上传到服务器的文件没有乱码了,但是页面上显示的还是会乱码。
Buffer.from(originalname, "latin1").toString("utf8"
);
然后又加上了方案一的代码,页面上也不乱码了。
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
总结:上面这两段代码都加上就可以解决node上传文件时中文乱码的问题
附上我改完后的完整代码
app.post('/file_upload', function(req, res) {// 解析文件名var originalname = Buffer.from(req.files[0].originalname, "latin1").toString("utf8");var des_file = __dirname + "/" + originalname;fs.readFile(req.files[0].path, function(err, data){fs.writeFile(des_file, data, function(err) {var response = {}if(err) {console.error(err);} else {response = {message: 'File uploaded successfully',filename: originalname}}// 添加响应头res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});res.end(JSON.stringify(response));})})
})