使用阿里云OSS
这里使用的是egg.js框架下的node.js进行实现
初始化
配置
config.aliOss = {
region: '<Your region>',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>'
bucket: '<Your bucket name>',
internal: true,
};
internal:[internal] {Boolean}:是否使用阿里云内网访问,默认false。比如通过ECS访问OSS,则设置为true,采用internal的endpoint可节约费用。
生成client实例
本例是写在service层的,注意config的获取方法,是个坑
/**
* 获取OSS实例
* @author Hiki
*/
async getClient(){
let Config = this.app.config.aliOss;
let client = new OSS({
region: Config.region,
accessKeyId: Config.accessKeyId,
accessKeySecret: Config.accessKeySecret,
bucket: Config.bucket,
});
return client;
}
上传文件
流式上传
/**
* 上传文件到OSS
* @author Hiki
*
* @param filename 文件名
* @param stream 文件流
*
* @return List ret:状态码, filename:OSS中保存的文件名
*/
async uploadtemp(filename, stream){
// 获取后缀名
let ext = stream.mimeType.split('/')[1];
filename += '.' + ext;
let client = await this.getClient();
let result = {
ret: -1,
filename: null,
url: null
};
try {
let file = await client.putStream(filename, stream);
result.filename = file.name;
result.ret = 0;
return result;
} catch (e) {
console.log(e);
return result;
}
}
putStream
方法返回的对象可以获得访问文件用的url,通过 .url
获得。
let file = await client.putStream(filename, stream);
file.url;
这里因为公司这个bucket使用了私有库,所以上传返回的url无法访问,所以没有获取。
这种情况下如果需要浏览图片,就需要将图片下载到本地后访问。
下载文件到本地
/**
* 下载图片到本地
* @author Hiki
*
* @param filename OSS文件名
* @param dir 存放的本地目录
*
* @return List ret:返回码, url:图片保存地址, filename:OSS中的文件名
*/
async getFile(filename, dir){
let client = await this.getClient();
//将地址分割成迭代的数组
let dirArr = dir.split("/");
let length = dirArr.length;
for( let i = 1; i < length; i++){
dirArr[i] = dirArr[i-1] + '/' + dirArr[i];
}
let picture = {
ret: 0,
url: null,
filname: null
}
try {
//创建文件夹
for( let n in dirArr){
await this.mkdir(dirArr[n]);
}
await client.get(filename,`app/public/upload/${filename}`);
picture.url = this.ctx.request.host + `/public/upload/${filename}`;
picture.filname = filename;
return picture;
} catch (e) {
console.log(e);
picture.ret = -1;
return picture;
}
}
这里用了分割目录并且一层层创建目录是因为node.js的坑,无法一次性多层创建目录。关于node.js这边的目录生成另外做笔记。
这里还用了 this.ctx.request.host
来获取当前host,来确保浏览器能访问得到。
github: https://github.com/Hikiy
作者:Hiki
创建日期:2019.06.28
更新日期:2019.06.28
(转载本站文章请注明作者和出处 Hiki)