feat: add cocos-service configuration file feat: add device configuration file feat: add engine configuration file feat: add information configuration file feat: add program configuration file feat: add project configuration file feat: add TypeScript configuration file
89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
const fs = require("fs");
|
|
const path = require("path");
|
|
const https = require("https");
|
|
const URL = require("url").URL;
|
|
const EventEmitter = require("events");
|
|
const err = (msg) => new EventEmitter().emit("error", msg);
|
|
|
|
/**
|
|
* TinyPng 远程压缩 HTTPS 请求的配置生成方法
|
|
*/
|
|
|
|
function getAjaxOptions() {
|
|
return {
|
|
method: "POST",
|
|
hostname: "tinypng.com",
|
|
path: "/web/shrink",
|
|
headers: {
|
|
rejectUnauthorized: false,
|
|
"X-Forwarded-For": Array(4)
|
|
.fill(1)
|
|
.map(() => parseInt(Math.random() * 254 + 1))
|
|
.join("."),
|
|
"Postman-Token": Date.now(),
|
|
"Cache-Control": "no-cache",
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
"User-Agent":
|
|
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* TinyPng 远程压缩 HTTPS 请求
|
|
* @param {string} img 待处理的文件
|
|
* @success {
|
|
* "input": { "size": 887, "type": "image/png" },
|
|
* "output": { "size": 785, "type": "image/png", "width": 81, "height": 81, "ratio": 0.885, "url": "https://tinypng.com/web/output/7aztz90nq5p9545zch8gjzqg5ubdatd6" }
|
|
* }
|
|
* @error {"error": "Bad request", "message" : "Request is invalid"}
|
|
*/
|
|
function fileUpload(imgPath) {
|
|
let req = https.request(getAjaxOptions(), (res) => {
|
|
res.on("data", (buf) => {
|
|
let obj = JSON.parse(buf.toString());
|
|
if (obj.error)
|
|
console.log(`压缩失败!\n 当前文件:${imgPath} \n ${obj.message}`);
|
|
else fileUpdate(imgPath, obj);
|
|
});
|
|
});
|
|
|
|
req.write(fs.readFileSync(imgPath), "binary");
|
|
req.on("error", (e) =>
|
|
console.log(`请求错误! 当前文件:${path.basename(imgPath)} \n`, e)
|
|
);
|
|
req.end();
|
|
}
|
|
|
|
// 该方法被循环调用,请求图片数据
|
|
function fileUpdate(entryImgPath, obj) {
|
|
let options = new URL(obj.output.url);
|
|
let req = https.request(options, (res) => {
|
|
let body = "";
|
|
res.setEncoding("binary");
|
|
res.on("data", (data) => (body += data));
|
|
res.on("end", () => {
|
|
fs.writeFile(entryImgPath, body, "binary", (err) => {
|
|
if (err) return console.error(err);
|
|
let log = `压缩成功:`;
|
|
log += `${path.basename(entryImgPath)}、压缩率:${ ((1 - obj.output.ratio) * 100).toFixed(2) }%、压缩前后大小:${(obj.output.size / 1024).toFixed(2)} / ${(obj.input.size / 1024).toFixed(2)}`
|
|
console.log(log);
|
|
});
|
|
});
|
|
});
|
|
req.on("error", (e) => console.warn('压缩失败:',path.basename(entryImgPath) ,e));
|
|
req.end();
|
|
}
|
|
|
|
module.exports = {
|
|
/**
|
|
* 调用压缩工具api
|
|
* @param {Array<{file:string,uuid:string}>} fileInfo
|
|
*/
|
|
async compressPicture(arrList,imageFileList){
|
|
for (let i = 0; i < arrList.length; i++) {
|
|
const imgPath = arrList[i];
|
|
fileUpload(imgPath);
|
|
}
|
|
}
|
|
} |