使用預簽名URL直傳對象存儲
更新時間 2024-12-24 13:53:18
最近更新時間: 2024-12-24 13:53:18
分享文章
本文介紹使用預簽名URL直傳對象存儲的實踐。
實踐背景
對象存儲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:
//jiangsu-10.zos.daliqc.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:
//jiangsu-10.zos.daliqc.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")
}