node发布网站到oss

const path = require("path");
const fs = require("fs");
const OSS = require("ali-oss");
class Oss {
  constructor() {
    this.upOss();
  }
  getAllFile = function (dir) {
    const res = [];
    function traverse(dir) {
      fs.readdirSync(dir).forEach((file) => {
        const pathname = path.join(dir, file);
        if (fs.statSync(pathname).isDirectory()) {
          traverse(pathname);
        } else {
          res.push(pathname);
        }
      });
    }
    traverse(dir);
    return res;
  };
  upOss = async () => {
    const client = new OSS({
      region: process.env.region,
      accessKeyId: process.env.accessKeyId,
      accessKeySecret: process.env.accessKeySecret,
      bucket: process.env.bucket,
    });
    const { objects } = await client.list({
      "max-keys": 1000,
    });

    const sFileList = !objects ? [] : objects.flatMap((it) => it.name);
    const distPath = path.normalize(path.join(__dirname, "../../dist"));
    const cFilelist = this.getAllFile(distPath);
    const errorFile = [];
    const objFile = {};
    const cFilePathlist = [];
    cFilelist.forEach((it) => {
      const fileName = it
        .replace(distPath, "")
        .replace(/^\\|\//, "")
        .replace("\\", "/");
      objFile[fileName] = it;
      fileName != "index.html" && cFilePathlist.push(fileName);
    });

    // 需要删除的文件
    const delFileList = sFileList.filter(
      (it) => !cFilePathlist.includes(it) && it != "index.html"
    );

    const addFileList = cFilePathlist.filter((it) => {
      return !sFileList.includes(it) || !it.includes("/");
    });

    console.log("addFileList :>> ", addFileList.length, addFileList);
    console.log("delFileList :>> ", delFileList.length, delFileList);
    addFileList.forEach(async (it) => {
      const { res } = await client.put(it, objFile[it]);
      res.status != 200 && errorFile.push(it);
    });
    if (!errorFile.length) {
      // 上传index.html
      const { res } = await client.put("index.html", objFile["index.html"]);

      console.info("发布  :>> ", res.status == 200 ? "成功" : "失败");
      if (res.status == 200) {
        const delError = [];
        delFileList.forEach(async (it) => {
          const res2 = await client.delete(it);
          res2.res.status != 200 && delError.push(it);
        });
        console.log("清理文件  :>> ", !delError.length ? "成功" : "失败");
      }
    }
  };
}
new Oss();
module.exports = Oss;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值