阿里云oss私有桶图片处理
针对OSS内存储的图片文件(Object),您可以在GetObject请求中携带图片处理参数对图片文件进行处理。例如添加图片水印、转换格式等。详情见:官方文档
对于允许公共读写的文件可以直接在图片URL后面拼接参数的方式进行图片处理,格式:https://bucketname.endpoint/objectname?x-oss-process=image/action,parame_value
对于不允许匿名访问的私有图片文件,不支持通过文件URL直接添加参数的方式处理图片,您需要通过SDK的方式将图片处理操作加入签名URL中。
重要: 通过文件URL访问图片时,默认是下载行为。如需确保通过文件URL访问图片时是预览行为,您需要绑定自定义域名并添加CNAME记录。具体操作,请参见绑定自定义域名。
所以,私有桶的图片是不能直接添加参数处理,否则会返回错误信息:
SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your key and signing method.
SDK处理方法,以go版本为例:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
HandleError(err)
}
// 指定图片所在Bucket的名称,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 指定图片名称。如果图片不在Bucket根目录,需携带文件完整路径,例如exampledir/example.jpg。
ossImageName := "exampledir/example.jpg"
// 生成带签名的URL,并指定过期时间为600s。
signedURL, err := bucket.SignURL(ossImageName, oss.HTTPGet, 600, oss.Process("image/format,png"))
if err != nil {
HandleError(err)
} else {
fmt.Println(signedURL)
}
}
其中,yourAccessKeyId
,yourAccessKeySecret
的来源参考该文,阿里云OSS上传报错: You have no right to access this object because of bucket acl。创建完用户需要创建AccessKeyId,接着就可以创建yourAccessKeyId和AccessKeySecret。
最后会生成完整的图片链接,注意,如果发现链接中多出了bucket,需要排查yourEndpoint是否已经加上了bucket,需要删除掉。