← 返回首页

SIGNAL · POST

node上传文件乱码

约 4 分钟阅读 bajiu 前端

nodejs、express、multer 中文名乱码问题

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));
    })
  })
})

解决

文件上传服务器接收文件列表中文件名名不支持中文,nodejs对中文的支持不友好,所以我们要进行一次编码转换

Buffer.from(originalname, "latin1").toString(
    "utf8"
);
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});

修改之后的完整代码

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));
    })
  })
})