联通云 node 上传文件至oss

77 阅读1分钟

node 将文件上传到oss实现项目版本化管理

  • 联通云对象存储OSS兼容Amazon S3接口,因此您可以使用S3的官方SDK调用联通云OSS的API接口。AWS
  • 定义一个js文件,名字自定义(如:aws-oss)将下述代码直接粘贴进入
  • 依赖 aws-sdk
  • 配置好你的联通云账户相关信息
  • 执行 node aws-oss.js version=1.0.0 则会进行上传操作,(上传成功就可以在联通云控制台查看相关资源了)
const AWS = require('aws-sdk')
const path = require('path')
const fs = require('fs-extra')
const argv = process.argv.splice(2)[0]
const versionName = argv.replace('version=', '')
if (!versionName) {
  throw new Error('版本号必传')
}

const s3 = new AWS.S3({
  endpoint: 'xxxxxx',
  accessKeyId: 'xxxxxx',
  secretAccessKey: 'xxxxxx',
  region: 'xxxxxx',
  s3ForcePathStyle: true,
  // 继续使用 https,但会跳过证书验证。
  httpOptions: {
    agent: new require('https').Agent({ rejectUnauthorized: false })
  }
})

const Bucket = 'static'
const KEY = 'test/' // 文件夹名称

const putOSS = async function (filePath, dirPath) {
  const buffer = fs.readFileSync(filePath)
  const params = {
    Body: buffer,
    Bucket,
    ACL: 'public-read', // 设置文件为公共读权限
    Key: KEY + dirPath.replaceAll('\', '/')
  }
  try {
    return s3.upload(params).promise()
  } catch (e) {
    console.error('上传报错了', e)
  }
}
// eslint-disable-next-line func-style
async function addFileToOSSSync(dir, newDirName) {
  const files = fs.readdirSync(dir)
  const _p = files.map(async (doc) => {
    const src = dir + '\' + doc,
      _newDirName = newDirName + '\' + doc
    const st = fs.statSync(src)
    // 判断是否为文件
    if (st.isFile() && doc !== '.DS_Store') {
      return putOSS(src, _newDirName)
    }
    // 如果是目录则递归调用自身
    else if (st.isDirectory()) {
      return addFileToOSSSync(src, _newDirName)
    }
  })
  return Promise.all(_p)
}
const dir = path.join(__dirname, '../dist')
console.log(`${versionName}资源上传中...`)
addFileToOSSSync(dir, versionName)
  .then(() => {
    console.log(`${versionName}资源已上传完毕`)
    return fetch('https://your-backend-api.com/notify-upload', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ message: 'All files uploaded successfully' })
    })
  })
  .then((response) => response.json())
  .then((data) => {
    console.log('后端接口响应:', data)
  })
  .catch((err) => {
    console.error('上传或通知过程中出现错误:', err)
  })