什么是HEIC
HEIC其实是苹果在iOS11及之后iOS系统设备,在拍摄照片时的默认图像存储格式。
它JPG相比,占用的空间更小,画质更加无损。
但IOS上传的HEIC格式图片,是无法被浏览器及window的识图软件打开的。
node使用heic-convert库处理HEIC图片,转换为一般格式后上传
const convert = require("heic-convert");
const multer = require("@koa/multer");
uploadsHeic: async (ctx, next) => {
const file = ctx.request.file;
let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "./static");
},
filename: function (req, file, cb) {
cb(
null,
file.fieldname +
"-" +
Date.now() +
"." +
file.originalname.split(".")[file.originalname.split(".").length - 1]
);
},
});
let limits = {
fields: 10, //非文件字段的数量
fileSize: 100000 * 1024, //文件大小 单位 kb
files: 1, //文件数量
};
let upload = multer({
storage,
limits,
});
let err = await upload
.single("uploadHeic")(ctx, next)
.then((res) => res)
.catch((err) => err);
if(!err &&file.mimetype == "image/heic"){
//获取heic文件的buffer
let heicBuffer = await new Promise((resolve, reject) => {
fs.readFile(
path.join(__dirname + `../../../static/${file.filename}`),
async (err, buffer) => {
if (err) {
reject(err);
} else {
resolve(buffer);
}
}
);
});
//使用heic-convert转换buffer格式
const outputBuffer = await convert({
buffer: heicBuffer, // the HEIC file buffer
format: "JPEG", // output format
quality: 1, // the jpeg compression quality, between 0 and 1
});
//生成文件
let newfileName = file.filename.split(".")[0] + ".jpg";
await new Promise((resolve, reject) => {
fs.writeFile(
path.join(__dirname, `../../static/${newfileName}`),
outputBuffer,
(err, buffer) => {
if (err) {
console.log(err);
reject(err);
} else {
resolve(buffer);
}
}
);
});
file.filename = newfileName;
localFile = "./static/" + file.filename;
}
}
heic-convert库具体参数参见git文档