文章目录
本文档介绍如何使用Golang调用腾讯云对象存储(COS),包括初始化客户端、上传文件和下载文件。
一、腾讯云COS对象存储创建
1.1 创建存储桶
-
我们需要创建一个用于存放对象的存储桶:
-
在 对象存储控制台 左侧导航栏中单击存储桶列表,进入存储桶管理页。
-
单击创建存储桶,输入以下配置信息,其他配置保持默认即可。
名称:输入存储桶名称。名称设置后不可修改。此处举例输入 exampleobjext 。
所属地域:存储桶所属地域,选择与您业务最近的一个地区,例如香港地域。
访问权限:存储桶访问权限,此处我们保持默认为“私有读写”。
单击确定,即可创建完成。
2.1 存储桶测试
- 上传对象
从本地选择文件上传到存储桶:
-
单击存储桶名称,进入存储桶列表页。
-
选择上传文件 > 选择文件,选择需要上传至存储桶的文件,例如文件名为 exampleobjext.txt 的文件。
-
单击上传,即可将文件 exampleobjext.txt 上传至存储桶。
- 下载对象
将云上数据下载到本地:
1.单击文件 exampleobjext.txt 右侧的详情,进入对象属性页。
2.在基本信息配置项中,单击下载对象即可下载,或单击复制临时链接,将链接粘贴至浏览器地址栏并回车,即可下载该对象。
- 删除对象
将云上对象数据删除:
-
在左侧导航栏中,单击【存储桶列表】,进入存储桶列表页面。
-
找到对象所在的存储桶,单击其存储桶名称,进入存储桶管理页面。
-
在左侧导航栏中,选择【文件列表】,进入文件列表页面。
-
勾选需要删除的对象,单击上方的【更多操作】>【删除】。
二、使用Golang调用腾讯云对象存储(COS)
2.1 安装COS SDK
go get -u github.com/tencentyun/cos-go-sdk-v5
2.2 初始化COS客户端
package main
import (
"context"
"fmt"
"github.com/tencentyun/cos-go-sdk-v5"
"net/http"
"net/url"
)
func initCOSClient(bucketName, region, secretID, secretKey string) *cos.Client {
u, _ := url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", bucketName, region))
b := &cos.BaseURL{BucketURL: u}
return cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: secretID,
SecretKey: secretKey,
},
})
}
func main() {
client := initCOSClient("<your-bucket-name>", "<region>", "<your-secret-id>", "<your-secret-key>")
fmt.Println("COS client initialized successfully.")
}
2.3 上传文件
下面的函数用于将本地文件上传到COS。
- 上传文件方法
func uploadFile(client *cos.Client, localFilePath, remoteFilePath string) error {
fmt.Printf("Uploading file from %s to %s\n", localFilePath, remoteFilePath)
f, err := os.Open(localFilePath)
if err != nil {
return fmt.Errorf("opening file: %v", err)
}
defer f.Close()
_, err = client.Object.Put(context.Background(), remoteFilePath, f, nil)
if err != nil {
return fmt.Errorf("uploading file: %v", err)
}
return nil
}
- 方法调用示例
func main() {
client := initCOSClient("<your-bucket-name>", "<region>", "<your-secret-id>", "<your-secret-key>")
localUploadPath := "local/path/to/example.txt"
remoteUploadPath := "remote/path/to/example.txt"
err := uploadFile(client, localUploadPath, remoteUploadPath)
if err != nil {
fmt.Println("Error uploading file:", err)
} else {
fmt.Println("File uploaded successfully.")
}
}
2.4 下载文件
下面的函数用于从COS下载文件并保存到本地。
- 下载文件方法
func downloadFile(client *cos.Client, remoteFilePath, localFilePath string) error {
fmt.Printf("Downloading file from %s to %s\n", remoteFilePath, localFilePath)
// 确保目录存在
dir := filepath.Dir(localFilePath)
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("creating directories: %v", err)
}
resp, err := client.Object.Get(context.Background(), remoteFilePath, nil)
if err != nil {
return fmt.Errorf("downloading file: %v", err)
}
defer resp.Body.Close()
localFile, err := os.Create(localFilePath)
if err != nil {
return fmt.Errorf("creating file: %v", err)
}
defer localFile.Close()
_, err = localFile.ReadFrom(resp.Body)
if err != nil {
return fmt.Errorf("writing to file: %v", err)
}
return nil
}
- 方法调用示例
func main() {
client := initCOSClient("<your-bucket-name>", "<region>", "<your-secret-id>", "<your-secret-key>")
localDownloadPath := "local/path/to/downloaded_example.txt"
remoteDownloadPath := "remote/path/to/example.txt"
err := downloadFile(client, remoteDownloadPath, localDownloadPath)
if err != nil {
fmt.Println("Error downloading file:", err)
} else {
fmt.Println("File downloaded successfully.")
}
}
2.5 列出存储桶中的对象
有时候我们可能需要列出存储桶中的对象以确认文件是否存在。
func listObjects(client *cos.Client, prefix string) error {
opt := &cos.BucketGetOptions{
Prefix: prefix,
}
v, _, err := client.Bucket.Get(context.Background(), opt)
if err != nil {
return fmt.Errorf("listing objects: %v", err)
}
for _, c := range v.Contents {
fmt.Println(c.Key)
}
return nil
}
func main() {
client := initCOSClient("<your-bucket-name>", "<region>", "<your-secret-id>", "<your-secret-key>")
// 列出存储桶中的对象
err := listObjects(client, "remote/path/to/")
if err != nil {
fmt.Println("Error listing objects:", err)
}
}
2.6 整体代码示例
package main
import (
"context"
"fmt"
"github.com/tencentyun/cos-go-sdk-v5"
"net/http"
"net/url"
"os"
"path/filepath"
)
func main() {
// 初始化COS客户端
client := initCOSClient("<your-bucket-name>", "<region>", "<your-secret-id>", "<your-secret-key>")
// 上传文件
localUploadPath := "local/path/to/example.txt"
remoteUploadPath := "remote/path/to/example.txt"
err := uploadFile(client, localUploadPath, remoteUploadPath)
if err != nil {
fmt.Println("Error uploading file:", err)
} else {
fmt.Println("File uploaded successfully.")
}
// 下载文件
localDownloadPath := "local/path/to/downloaded_example.txt"
remoteDownloadPath := "remote/path/to/example.txt"
err = downloadFile(client, remoteDownloadPath, localDownloadPath)
if err != nil {
fmt.Println("Error downloading file:", err)
} else {
fmt.Println("File downloaded successfully.")
}
// 列出存储桶中的对象
err = listObjects(client, "remote/path/to/")
if err != nil {
fmt.Println("Error listing objects:", err)
}
}
// 初始化COS客户端
func initCOSClient(bucketName, region, secretID, secretKey string) *cos.Client {
u, _ := url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", bucketName, region))
b := &cos.BaseURL{BucketURL: u}
return cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: secretID,
SecretKey: secretKey,
},
})
}
// 上传文件
func uploadFile(client *cos.Client, localFilePath, remoteFilePath string) error {
fmt.Printf("Uploading file from %s to %s\n", localFilePath, remoteFilePath)
f, err := os.Open(localFilePath)
if err != nil {
return fmt.Errorf("opening file: %v", err)
}
defer f.Close()
_, err = client.Object.Put(context.Background(), remoteFilePath, f, nil)
if err != nil {
return fmt.Errorf("uploading file: %v", err)
}
return nil
}
// 下载文件
func downloadFile(client *cos.Client, remoteFilePath, localFilePath string) error {
fmt.Printf("Downloading file from %s to %s\n", remoteFilePath, localFilePath)
// 确保目录存在
dir := filepath.Dir(localFilePath)
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("creating directories: %v", err)
}
resp, err := client.Object.Get(context.Background(), remoteFilePath, nil)
if err != nil {
return fmt.Errorf("downloading file: %v", err)
}
defer resp.Body.Close()
localFile, err := os.Create(localFilePath)
if err != nil {
return fmt.Errorf("creating file: %v", err)
}
defer localFile.Close()
_, err = localFile.ReadFrom(resp.Body)
if err != nil {
return fmt.Errorf("writing to file: %v", err)
}
return nil
}
// 列出存储桶中的对象
func listObjects(client *cos.Client, prefix string) error {
opt := &cos.BucketGetOptions{
Prefix: prefix,
}
v, _, err := client.Bucket.Get(context.Background(), opt)
if err != nil {
return fmt.Errorf("listing objects: %v", err)
}
for _, c := range v.Contents {
fmt.Println(c.Key)
}
return nil
}
参考文档:
- 腾讯云对象存储创建文档:https://cloud.tencent.com/document/product/436/14106
- 腾讯云对象存储golang-SDK:https://cloud.tencent.com/document/product/436/31215
- 腾讯云对象存储常见问题:https://cloud.tencent.com/document/product/436/30748