1.0.0 • Published 4 years ago

xr-cos-node v1.0.0

Weekly downloads
-
License
ISC
Repository
-
Last release
4 years ago

COS NODE

腾讯云 COS 二次封装

功能

  • 支持使用 glob 字符串指定一个或多个文件上传
  • png 图片支持压缩上传
  • 支持使用获取临时密钥
  • 支持修改资源域名
  • 支持 CDN 刷新 URL

安装

yarn add xr-cos-node

参数

 * @param {string} [opts.bucket] - 上传 bucket
 * @param {string} [opts.region] - 上传 region
 * @param {string} [opts.domain] - 自定义域名
 * @param {number} [opts.sliceSize] - 单个分片大小
 * @param {Object} [opts.cosOptions] - cos 其他参数
 * @param {string} [opts.signUrl=https://open.aihaisi.com/qcloud/api/token] - cos 获取临时密钥URL
 * @param {string} [opts.secret] - 获取临时密钥的 secret
 * @param {Object} [opts.signOptions] - 签名的其他参数
 * @param {function} [opts.getAuth] - 自定义获取临时签名
 * @param {function} [opts.retry=3] - 获取密钥失败重试次数
 * @param {string} [opts.secretId] - secretId
 * @param {string} [opts.secretKey] - secretKey
 * @param {function} [opts.fileKey] - 自定义文件 Key,传入文件当前路径和相对目录
 * @param {string} [opts.target] - glob 字符串,默认当前目录下的所有文件
 * @param {boolean} [opts.refreshUrl=false] - 上传成功后刷新 url
 * @param {boolean} [opts.refreshDomain] - 替换刷新 url 的域名
 * @param {string} [opts.protocol=https://] - 上传文件的协议
 * @param {Object} [opts.pngquantOptions] - png 图片压缩,为空不进行压缩

事件

可以使用 ononce 订阅事件

事件名描述
auth-success获取临时密钥成功
auth-failed获取临时密钥失败
options-invalid参数不合法
get-files-failed获取需要上传文件失败
upload-empty需要上传的文件为空
upload-file-success上传单个文件成功
upload-file-failed获取临时密钥失败
before-refresh-url刷新url前
refresh-url-success刷新 url 成功
refresh-url-failed刷新 url 失败
upload-finish上传结束

密钥

可以配置 secretId, secretKey 设置永久密钥

临时密钥

signUrl, secretsignOptions 可以配置获取临时密钥,或者使用 getAuth 自己实现。

const cos = new COS({
  bucket: '**********',
  region: '**********',
  secret: '**********',
  signOptions: { // 该参数会进行字典排序
    partnerId: '**********',
    other: '**********'
  },
})

自定义 getAuth 需要返回 Promise 数据为如下:

{
  TmpSecretId,
  TmpSecretKey,
  XCosSecurityToken,
  ExpiredTime
}

可以调用 cos.getAuth() 方法获取临时密钥。

自定义上传文件 KEY

默认情况上的文件 key 是相对于当前执行目录。比如上传当前目录下的 index.js 那么文件的 key 就是 index.js

如果要自定义上传文件 key 可以指定 fileKey 参数。

const cos = new COS({
  fileKey: (absolutePath, relativePath) => {
    return path.relative(distPath, p)
  } 
})

PNG 压缩

const cos = new COS({
  pngquantOptions: {
    quality: [0.6, 0.8]
  }
})

更多参数可以查看 imagemin-pngquant

URL 刷新

当上的文件名没有 hash 部分时,新的文件覆盖了老的文件。但是由于缓存资源时,会发现还是老的文件,这时候就可以使用 URL 刷新。

const cos = new COS({
  refreshUrl: true, // 开启刷新
  refreshDomain: 'lib.xingren.com', // 当上传的域名和访问的域名不一样时可以指定该参数。
})

还可以使用如下 API 自定义 URL 刷新

// 自定义刷新域名
cos.refreshUrls(['https://lib.xingren.com/a.js'])
  .then(console.log)
  .catch(console.error)

完整例子

const path = require('path');
const COS = require('xr-cos-node');
const ora = require('ora');

const distPath = path.resolve(__dirname, 'dist');
const cos = new COS({
  bucket: '**********',
  region: '**********',
  secret: '**********',
  signOptions: {
    partnerId: '**********'
  },
  target: 'dist/static/**/*',
  fileKey: (p) => path.relative(distPath, p)
});
const spinner = ora('准备上传').start();

let hasError = false;
cos
  .on('auth-failed', (err) => {
    console.error(err)
    spinner.fail('获取临时密钥失败')
    process.exit(1)
  })
  .on('options-invalid', (err) => {
    console.error(err)
    spinner.fail('参数不合法')
    process.exit(1)
  })
  .on('get-files-failed', (err) => {
    console.error(err)
    spinner.fail('获取文件失败')
    process.exit(1)
  })
  .on('upload-empty', () => {
    console.error(err)
    spinner.fail('上传的文件为空')
    process.exit(1)
  })
  .on('before-upload', (files) => {
    spinner.text='开始上传'
  })
  .on('upload-progress', (info) => {
    const percent = parseInt(info.percent * 10000) / 100;
    const speed = parseInt(info.speed / 1024 / 1024 * 100) / 100;
    spinner.text = '进度:' + percent + '%; 速度:' + speed + 'Mb/s;'
  })
  .on('upload-file-failed', (err, data) => {
    console.error(err)
    console.error(data)
    hasError = true
  })
  .on('refresh-url-failed', (err, urls) => {
    console.log(urls)
    console.log(err)
    hasError = true
  })
  .on('upload-finish', () => {
    if (hasError) {
      spinner.fail('上传失败')
      process.exit(1)
    } else {
      spinner.succeed('全部上传成功')
    }
  });

cos.upload();