批量替换oss xml文件

174 阅读2分钟

上次菜鸟打印组件升级,遇到之前模板不兼容的情况,需要做修改

本来想的是用户点击获取模板的时候,先去oss上面把文件处理完替换掉,但是写着写着发现,模板的oss域名和这个项目的oss的域名不是同一个……后端说她搞太麻烦了

可是,有上万份模板啊!!!

没办法,只能自己写个脚本去替换了

utf-8

之前打印组件的时候,模板文件前面多了个'\uFFEF'

从oss上读取文件的时候,发现第一位是这个

image.png

这三个字节和'\uFFEF'有啥关系呢?

把它转成二进制

239187191
111011111011101110111111

由于是3个字节的,需要遵循下面格式提取

3 字节 1110xxxx 10xxxxxx 10xxxxxx 

提取出来的数字是1111 1110 1111 1111

转换成16进制就是FEFF

思路

用nodejs账密的方式创建oss的实例client,然后拿到oss上面的文件列表list,list循环文件内容,然后用正则替换格式,最后再上传覆盖。

关键的地方在正则替换,之前忘记从哪里看了replace的高阶用法,这次就用上了

function transformTemplate(data) {
  let needPost = false;
  const handleResult = data.replace(/style=".*?"/gm, (all) => { // 不合法的空格在style="padding: 1px;"里面
    return all.replace(/(.+?:)( )(.+?;)/gm, (childAll, key, space, value) => { // 这步把空格给去掉了,key="padding:",space=" ", value="1px;" 
      winlogger.info("含有空格的style:" + all);
      needPost = true;
      return key + value;
    });
  });
  return {
    needPost,
    handleResult,
  };
}

完整代码

const winlogger = require("./logger");
const oss = require("ali-oss");

const ali_oss = {
  bucket: "***",
  endPoint: "***",
};

const client = new oss({
  region: "***",
  accessKeyId: "***",
  accessKeySecret: "***",
  bucket: "yourbucketname",
});
client.useBucket(ali_oss.bucket);

async function list(dir) {
  let continuationToken = null;
  // 每页列举20个文件。
  const maxKeys = 20;
  do {
    const result = await client.listV2({
      "continuation-token": continuationToken,
      "max-keys": maxKeys,
      prefix: dir,
    });
    continuationToken = result.nextContinuationToken;
    result.objects
      .filter((item) => item.name.includes(".xml"))
      .forEach((file) => {
        winlogger.info("start handle:" + file.name);
        getBuffer(file.name);
      });
  } while (continuationToken);
}

function transformTemplate(data) {
  let needPost = false;
  const handleResult = data.replace(/style=".*?"/gm, (all) => {
    return all.replace(/(.+?:)( )(.+?;)/gm, (childAll, key, space, value) => {
      winlogger.info("含有空格的style:" + all);
      needPost = true;
      return key + value;
    });
  });
  return {
    needPost,
    handleResult,
  };
}

async function getBuffer(name) {
  try {
    const result = await client.get(name);
    winlogger.info("get content:" + name);
    let data = result.content.toString();
    const firstStr = data[0];
    let needPostByFEFF = false;
    if (firstStr === "\uFEFF") { // 去掉FEFF
      winlogger.info("delete FEFF:" + name);
      data = data.slice(1);
      needPostByFEFF = true;
    }
    const { needPost, handleResult } = transformTemplate(data);

    if (needPost || needPostByFEFF) {
      winlogger.info("replace:" + name);
      client.put(name, new Buffer(handleResult));
    }
  } catch (e) {
    console.log(e);
    winlogger.info(e);
  }
}
list("windows/template-editor/template/debug/"); // 模板文件夹