45

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

 5 years ago
source link: https://studygolang.com/articles/14428?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用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 合并进去。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK