实践背景
对象存储SDK提供的预签名接口可以生成预签名URL,通过预签名URL,移动端APP可以直接上传或者下载文件。不需要使用SDK和密钥,使用HTTP接口就可以进行文件的上传和下载。
应用流程
使用预签名URL直传对象存储应用流程如下:
操作步骤
业务服务器配置长期密钥,调用 SDK 的预签名接口生成预签名 URL。
具体可参考如下Golang示例。
生成预签名上传URL
请求示例
func PresignPutObjectRequest(s3c *s3.S3) {
bucket := "example-bucket"
key := "example-key"
input := &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
// 构造请求
request, _ := s3c.PutObjectRequest(input)
// 设定预签名链接过期时间
expire := 15 * time.Minute
// 预签名请求
output, err := request.Presign(expire)
if err != nil {
fmt.Printf("* Status: Fail\n* Output:\n%v\n* Error:\n%v\n", output, err)
} else {
fmt.Printf("* Status: Susccess\n* Output:\n%v\n", output)
}
}
响应示例
生成的预签名URL见 Output
部分。
* Status: Susccess
* Output:
https://jiangsu-10.zos.ctyun.cn/example-bucket/example-key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=XXXXXXXXXXXXXXXXXXXX%2F20241217%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20000101T123414Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x
应用示例
下方函数可通过预签名URL上传对象到对象存储。
func UsePresignGetObjectUrl(url string) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
// TODO 需修改为本地文件路径
file, err := os.Create("OUTPUT_FILE_NAME")
if err != nil {
panic(err)
}
defer file.Close()
_, err = io.Copy(file, res.Body)
if err != nil {
panic(err)
}
println("Download success")
}
生成预签名下载URL
请求示例
func PresignGetObjectRequest(s3c *s3.S3) {
bucket := "example-bucket"
key := "example-key"
input := &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
// 构造请求
request, _ := s3c.GetObjectRequest(input)
// 设定预签名链接过期时间
expire := 15 * time.Minute
// 预签名请求
output, err := request.Presign(expire)
if err != nil {
fmt.Printf("* Status: Fail\n* Output:\n%v\n* Error:\n%v\n", output, err)
} else {
fmt.Printf("* Status: Susccess\n* Output:\n%v\n", output)
}
}
响应示例
生成的预签名URL见 Output
部分。
* Status: Susccess
* Output:
https://jiangsu-10.zos.ctyun.cn/example-bucket/example-key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=XXXXXXXXXXXXXXXXXXXX%2F20241217%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20000101T123414Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x
应用示例
下方函数可通过预签名URL下载对象到本地。
func UsePresignGetObjectUrl(url string) {
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// TODO 需修改为本地文件路径
file, err := os.Create("OUTPUT_FILE_NAME")
if err != nil {
panic(err)
}
defer file.Close()
_, err = io.Copy(file, resp.Body)
if err != nil {
panic(err)
}
println("Download success")
}