node.js学习记录:使用阿里云OSS

2019/06/28

使用阿里云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

Post Directory