压缩文件,上传文件或文件夹(目录)到ALI-OSS

1,118 阅读1分钟

阿里OSS默认并不支持文件夹的上传,只允许单个文件的上传。如果有上传文件夹的需求,有两种方法:1、可以遍历文件夹,逐个上传文件。2、压缩文件后上传。

需要用到的npm包

ali-oss
compressing

首先新建一个uploadOSS.js文件,代码如下。

OSS提供的上传方法

const packageJSON = JSON.parse(fs.readFileSync("package.json", "utf8"));
const remotePath = `/ossDir/${packageJSON.version}/`;
const localPath = "./localhostDir/";
const client = new OSS({
  endpoint: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  accessKeyId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  accessKeySecret: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  bucket: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
});
async function uploadDir(file) {
  try {
    // 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
    // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    // file的path默认是反斜杠,需要转为正斜杠。
    const formatFile = path.normalize(file).replace(/\\/g, "/");
    const remotePaths = remotePath + formatFile;
    const result = await client.put(remotePaths, formatFile);
    if (result.res.status === 200) {
      console.log("UPLOAD SUCCESS:" + formatFile);
    }
  } catch (e) {
    console.log(e);
  }
}
async function upload(file, uploadedName) {
  try {
    // 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
    // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    // file的path默认是反斜杠,需要转为正斜杠。
    const formatFile = path.normalize(file).replace(/\\/g, "/");
    const remotePaths = remotePath + uploadedName;
    const result = await client.put(remotePaths, formatFile);
    if (result.res.status === 200) {
      console.log("UPLOAD SUCCESS:" + formatFile);
    }
  } catch (e) {
    console.log(e);
  }
}

上传前清空文件夹

async function deleteAll () {
    const result = await client.list({
        prefix: remotePath
    });
    result.objects.forEach(item => {
        console.log("DELETE SUCCESS:" + item.name);
        client.delete(item.name);
    });
}

上传文件夹

function readDir(currentDirPath, callback) {
  fs.readdir(currentDirPath, function (err, files) {
    if (err) {
      throw new Error(err);
    }
    files.forEach(function (name) {
      var filePath = path.join(currentDirPath, name);
      var stat = fs.statSync(filePath);
      if (stat.isFile()) {
        callback(filePath, stat);
      } else if (stat.isDirectory()) {
        readDir(filePath, callback);
      }
    });
  });
}
readDir(localPath, function (filePath, stat) {
    uploadDir(filePath);
});

压缩文件后再上传

async function compressFolderAndUpload(path) {
  const fileName = `v${packageJSON.version}.tar`;
  const toPath = `./compress/${fileName}`;
  await compressing.tar.compressDir(path, toPath);
  upload(toPath, fileName);
}
compressFolderAndUpload(localPath);