同步处理(x-oss-process)是指程序执行一个任务时,必须等待该任务完成才能继续执行其他任务。本文介绍如何使用Go SDK V2进行同步处理的场景,例如图片处理、文档处理等。
注意事项
本文示例代码以华东1(杭州)的地域ID
cn-hangzhou
为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS地域和访问域名。本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证。
方法定义
func (c *Client) ProcessObject(ctx context.Context, request *ProcessObjectRequest, optFns ...func(*Options)) (*ProcessObjectResult, error)
请求参数列表
参数名 | 类型 | 说明 |
ctx | context.Context | 请求的上下文,可以用来设置请求的总时限 |
request | *ProcessObjectRequest | 设置具体接口的请求参数,具体请参见ProcessObjectRequest |
optFns | ...func(*Options) | (可选)接口级的配置参数, 具体请参见Options |
返回值列表
返回值名 | 类型 | 说明 |
result | *ProcessObjectResult | 接口返回值,当 err 为nil 时有效,具体请参见ProcessObjectResult |
err | error | 请求的状态,当请求失败时,err 不为 nil |
示例代码
以下代码展示了如何使用Go SDK V2进行图片缩放的操作,并将处理后的图片持久化保存至指定的Bucket。
package main
import (
"context"
"encoding/base64"
"flag"
"fmt"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
objectName string
)
// init函数在main函数之前执行,用来初始化程序
func init() {
// 设置命令行参数来指定region
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
// 设置命令行参数来指定bucket名称
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
// 设置命令行参数来指定需要处理的图片名称
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
flag.Parse() // 解析命令行参数
// 检查是否提供了区域信息,如果没有提供,则输出默认参数并退出程序
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 检查是否提供了存储空间名称,如果没有提供,则输出默认参数并退出程序
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 检查是否提供了对象名称,如果没有提供,则输出默认参数并退出程序
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 创建配置对象,并使用环境变量作为凭证提供者和指定的区域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg) // 使用配置创建一个新的OSS客户端
// 指定用于存放处理后图片的Bucket名称,该Bucket需与原图所在Bucket在同一地域
targetBucketName := bucketName
// 指定处理后图片名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如exampledir/example.jpg
targetImageName := "exampledir/example.jpg"
// 将图片缩放为固定宽高100 px后转存到指定存储空间
style := "image/resize,m_fixed,w_100,h_100"
process := fmt.Sprintf("%s|sys/saveas,o_%v,b_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)), base64.URLEncoding.EncodeToString([]byte(targetBucketName)))
// 构建一个ProcessObject请求,用于发起对特定对象的同步处理
request := &oss.ProcessObjectRequest{
Bucket: oss.Ptr(bucketName), // 指定要操作的存储空间名称
Key: oss.Ptr(objectName), // 指定要处理的图片名称
Process: oss.Ptr(process), // 指定处理指令
}
// 执行请求以同步处理对象,并接收返回结果
result, err := client.ProcessObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to process object %v", err)
}
log.Printf("process object result:%#v\n", result)
}
常见使用场景
相关文档
关于图片处理参数的更多信息,请参见图片处理参数。
关于同步处理功能的更多信息,请参见同步处理。
关于同步处理功能的API接口,请参见ProcessObject。
该文章对您有帮助吗?