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)
})