1.0.0 • Published 4 years ago
xr-cos-node v1.0.0
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 图片压缩,为空不进行压缩
事件
可以使用 on
或 once
订阅事件
事件名 | 描述 |
---|---|
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
, secret
和 signOptions
可以配置获取临时密钥,或者使用 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();