需求:前端上传文件到Node —>Node上传文件到OSS
问题:部分文件上传后会出现乱码
原因:Node原生读取文件又不支持GBK编码
解决思路:①判断文件编码格式是否是UTF-8②文件编码格式不是UTF-8时,进行转码
第一步:获取文件编码格式
1.使用jschardet模块获取文件编码格式
①安装jschardet模块
npm install jschardet
②获取文件内容
//引入文件
const jschardet = require("jschardet");
//filePath ==> 文件路径
const stream = fs.createReadStream(filePath, { encoding: "binary" });
let data = "";
stream.on("error", err => {
console.error("读取行错误");
console.error(err);
});
stream.on("data", chunk => {
data += chunk;
});
stream.on("end", () => {
let result = jschardet.detect(data);
console.log(result.encoding) //输出文件编码格式
});
2.文件格式不是UTF8,通过iconv用GBK解码
①安装iconv-lite
npm install iconv-lite
②解码
const buf = Buffer.from(data, "binary");
const str = iconv.decode(buf, "GBK"); // 得到正常的字符串,没有乱码
完成的代码
//引入文件
const iconv = require("iconv-lite");
const jschardet = require("jschardet");
const fs = require("fs");
const { path: filePath } = req.files.file;
exports.uploadOSS = async function(req, res) {
const { path: filePath } = req.files.file;
//上传文件路径
let newFilePath = filePath;
const stream = fs.createReadStream(filePath, { encoding: "binary" });
let data = "";
stream.on("error", err => {
console.error("读取行错误");
console.error(err);
});
stream.on("data", chunk => {
data += chunk;
});
stream.on("end", () => {
let result = jschardet.detect(data);
//文件编码格式不是UTF-8
if (result.encoding !== "UTF-8") {
const buf = Buffer.from(data, "binary");
const str = iconv.decode(buf, "GBK"); // 得到正常的字符串,没有乱码
//重新写入文件后进行上传
fs.writeFile("/var/tmp/" + req.body.name, str, ["utf8"], function(err) {
if (err) console.log("fail " + err);
else console.log("写入文件ok");
//将文件地址重新赋值
newFilePath = "/var/tmp/" + req.body.name;
});
} else {
//文件编码格式是UTF-8
newFilePath = filePath;
}
}
}