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

aidenliu · · 763 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

本文来自:简书

感谢作者:aidenliu

查看原文:阿里云OSS Golang SDK处理图片功能

入群交流(和以上内容无关):加入Go大咖交流群,免费领全套学习资料或添加微信:muxilin131420 备注:入群;或加QQ群:729884609

763 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传