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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,083评论 18 139
  • 摘要: MaxCompute作为阿里巴巴集团内部绝大多数大数据处理需求的核心计算组件,拥有强大的计算能力,随着集团...
    猫耳呀阅读 916评论 1 0
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,934评论 3 118
  • 致 晴儿 举国欢庆的大年初五,迁徙的人们开始返程,休假的人们开始倒计时上班,老人们开始期盼下一次的全家团聚…………...
    54逆流之鱼阅读 152评论 0 1
  • 网络上流传一篇文章:海底捞提供各种变态服务,这帖子讲的是海底捞各种超出顾客预期的增值服务,比如说:吃完饭,客人想把...
    eashion阅读 732评论 0 0