使用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合并进去。
有疑问加站长微信联系(非本文作者)