官网介绍:OSSnode上传文件
node上传文件功能首先需要开权限,即拥有上传到服务器的权限,及对应的ID和secret,下面是OSS官网中介绍的node上传文件到OSS服务器的步骤
let OSS = require('ali-oss')
let client = new OSS({
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: 'Your bucket name'
});
async function put () {
try {
let result = await client.put('object-name', 'local-file');
console.log(result);
} catch (e) {
console.log(er);
}
}
put();
client是node对OSS服务器操作的必须品,所以格式一定要写对,才可以使用OSS服务器的一些功能
var client = new OSS({
region: 'oss-cn-beijing',//地域节点
accessKeyId: '*********',
accessKeySecret: '*******************',
bucket: 'hahaha'//域名
});
部分region,region项填入Region英文表示,详细见访问域名和数据中心
Region中文名称 | Region英文表示 | 外网Endpoint | 外网支持HTTPS | ECS访问的内网Endpoint | 内网支持HTTPS |
---|---|---|---|---|---|
华东 1 | oss-cn-hangzhou | oss-cn-hangzhou.aliyuncs.com | 是 | oss-cn-hangzhou-internal.aliyuncs.com | 是 |
华东 2 | oss-cn-shanghai | oss-cn-shanghai.aliyuncs.com | 是 | oss-cn-shanghai-internal.aliyuncs.com | 是 |
华北 1 | oss-cn-qingdao | oss-cn-qingdao.aliyuncs.com | 是 | oss-cn-qingdao-internal.aliyuncs.com | 是 |
华北 2 | oss-cn-beijing | oss-cn-beijing.aliyuncs.com | 是 | oss-cn-beijing-internal.aliyuncs.com | 是 |
华北 3 | oss-cn-zhangjiakou | oss-cn-zhangjiakou.aliyuncs.com | 是 | oss-cn-zhangjiakou-internal.aliyuncs.com | 是 |
华北 5 | oss-cn-huhehaote | oss-cn-huhehaote.aliyuncs.com | 是 | oss-cn-huhehaote-internal.aliyuncs.com | 是 |
华南 1 | oss-cn-shenzhen | oss-cn-shenzhen.aliyuncs.com | 是 | oss-cn-shenzhen-internal.aliyuncs.com | 是 |
Bucket是OSS上的命名空间,权限控制、日志记录等高级功能的管理实体;Bucket名称在整个OSS服务中具有全局唯一性,且不能修改;存储在OSS上的每个Object必须都包含在某个Bucket中。
可以看出官网给出的仅仅只有上传单个文件的功能,上传整体文件夹并没有提及,而且是路径上传,所以要上传整个文件夹,需要找到所以的文件,然后上传各自的路径就可以了
async function putOSS (src,dist) {
try {
let result = await client.put(dist, src);
console.log(result);
} catch (e) {
console.log(e);
}
}
function addFileToOSSSync(src,dist){
var docs = fs.readdirSync(src);
docs.forEach(function(doc){
var _src = src + '/' + doc,
_dist = dist + '/' + doc;
var st = fs.statSync( _src);
// 判断是否为文件
if( st.isFile()&&doc!=='.DS_Store' ){
putOSS(_src,_dist);
// console.log(_src+'是文件',_dist)
}
// 如果是目录则递归调用自身
else if( st.isDirectory() ){
// console.log(_src+'是文件夹')
addFileToOSSSync( _src,_dist);
}
})
}
addFileToOSSSync(global.glopwd + "/File/dist",'hahaha')
整体思路就是用回调的方式找出所有文件,然后上传到服务器,但是找出所有的文件就必须用到递归,判断是否为文件夹,如果为文件夹再去找文件夹下的所有文件,最后所有找到文件之后,每个文件单独使用官网提供的putOSS函数上传就可以了
需要注意的是上传服务器的路径问题,OSS是没有路径概念的,但是由虚拟路径去模拟的,所以上传一个文件到服务器中
putOSS (src,'haha/zz.zip')
putOSS (src,'haha/heihei/zz.zip')
这两种都可以上传,但是对应的虚拟路径在被访问时会转换为真实路径,所以要上传整个文件夹时,虚拟路径的层级关系千万要对应好!否则相互依赖的两个文件就会访问不到