美文网首页
阿里云OSS Golang SDK处理图片功能

阿里云OSS Golang SDK处理图片功能

作者: aidenliu | 来源:发表于2018-08-24 17:53 被阅读0次

    使用OSS Golang SDK进行图片处理时,发现提供的文档中,并没有提供图片处理的相关介绍。
    难道是SDK不支持图片处理?但SDK封装的是通用OSS Api,既然PHP/Python等语言的SDK支持了,Golang肯定也是有办法支持的。于是参照PHP SDK关于图片处理的代码,总结出了如下类似的示例。

    一、使用标准的HTTP GET请求:

    在URL的QueryString中设置处理参数(x-oss-process)。
    如果图片文件的访问权限为私有读写,必须通过授权才能进行访问。

    1、匿名访问

    通过如下格式的三级域名匿名访问处理后的图片:
    http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction>,<yourParamValue>
    匿名访问用于访问具有公开读写权限的bucket,无需调用 SDK,按上述规则拼装Url即可访问处理后的图片。

    2、授权访问

    通过调用SDK的SignURL方法生成授权访问的Url,生成过程中通过设置options参数,构建x-oss-process请求参数,使Url具有图片处理功能,通过访问Url即可访问处理后的图片。

        client, err := oss.New(config.Endpoint, config.AccessID, config.AccessKey)
        if err != nil {
            log.Fatalln(err)
        }
    
        bucket, err := client.Bucket("bucket_test")
        if err != nil {
            log.Fatal(err)
        }
    
        options := []oss.Option{
            oss.Process("image/resize,m_fixed,h_100,w_100"),
        }
    
        signUrl, err := bucket.SignURL("IMG_20180128_155838.jpg", oss.HTTPGet, 600, options...)
        if err != nil {
            log.Println(err)
        }
    
        fmt.Println(signUrl)
    

    二、使用SDK中的方法进行处理:

    参照PHP SDK文档中的相关示例代码,调用Goland SDK中类似的方法,构造出Golang示例代码:

    PHP代码:
    <?php
    if (is_file(__DIR__ . '/../autoload.php')) {
        require_once __DIR__ . '/../autoload.php';
    }
    if (is_file(__DIR__ . '/../vendor/autoload.php')) {
        require_once __DIR__ . '/../vendor/autoload.php';
    }
    use OSS\OssClient;
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    $accessKeyId = "<yourAccessKeyId>";
    $accessKeySecret = "<yourAccessKeySecret>";
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    $bucket = "<yourBucketName>";
    $object = "<yourObjectName>";
    $download_file = "download.jpg";
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    // 上传示例图片。
    $ossClient->uploadFile($bucket, $object, "example.jpg");
    // 图片缩放
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/resize,m_fixed,h_100,w_100" );
    $ossClient->getObject($bucket, $object, $options);
    // 图片裁剪
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/crop,w_100,h_100,x_100,y_100,r_1" );
    $ossClient->getObject($bucket, $object, $options);
    // 图片旋转
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/rotate,90" );
    $ossClient->getObject($bucket, $object, $options);
    // 图片锐化
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/sharpen,100" );
    $ossClient->getObject($bucket, $object, $options);
    // 图片水印
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ" );
    $ossClient->getObject($bucket, $object, $options);
    // 图片格式转换
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/format,png" );
    $ossClient->getObject($bucket, $object, $options);
    // 获取图片信息。
    $options = array(
        OssClient::OSS_FILE_DOWNLOAD => $download_file,
        OssClient::OSS_PROCESS => "image/info" );
    $ossClient->getObject($bucket, $object, $options);
    // 删除示例图片。
    $ossClient->deleteObject($bucket, $object);
    

    调用上述代码后,可以将处理后的图片或获取到信息保存到指定的$download_file 文件中。

    Golang代码
        client, err := oss.New(config.Endpoint, config.AccessID, config.AccessKey)
        if err != nil {
            log.Fatalln(err)
        }
    
        bucket, err := client.Bucket("bucket_test")
        if err != nil {
            log.Fatal(err)
        }
    
        options := []oss.Option{
            oss.Process("image/info"),
        }
        
            // 流式下载,处理后的图片以流的形式返回,可输出到标准输出
        body, err := bucket.GetObject("IMG_20180128_155838.jpg", options...)
        if err != nil {
            log.Fatalln(err)
        }
        defer body.Close()
        data, err := ioutil.ReadAll(body)
        if err != nil {
            log.Fatalln(err)
        }
    
        fmt.Println(string(data))
          
            // 下载到指定文件,处理后的图片或信息保存到指定的文件
        options := []oss.Option{
            oss.Process("image/resize,m_fixed,h_100,w_100"),
        }   
        err = bucket.GetObjectToFile("IMG_20180128_155838.jpg", "img.jpg", options...)
        fmt.Println(err)
    

    三、Golang SDK中的问题:

    处理缩略图时遇到oss.process("image/resize....")无效的问题,通过在SDK代码的的gitlab的issues遇到有类似问题的提问。问题原因是options.go文件中X-Oss-Process变量需改为小写:x-oss-process,目前SDK中还未将此bug Fix PR合并进去。

    相关文章

      网友评论

          本文标题:阿里云OSS Golang SDK处理图片功能

          本文链接:https://www.haomeiwen.com/subject/dwliiftx.html