human: 如何处理七牛云的对象存储使用 Go CDK 通过 S3 协议对接对象存储 Kodo

gpt: [对象存储](https://developer.qiniu.com/kodo) > 最佳实践 >
[对象存储开源生态建设](https://developer.qiniu.com/kodo/best_practices/12275/the-third-
party-software-extension-support) > 使用 Go CDK 对接对象存储 Kodo >使用 Go CDK 通过 S3
协议对接对象存储 Kodo

#  使用 Go CDK 通过 S3 协议对接对象存储 Kodo

最近更新时间: 2024-01-29 17:01:29

Go 云开发工具包（Go CDK）是一个支持跨云服务商的基础 SDK，提供多种通用的应用程序接口对接云存储，云事件以及云数据库。这里展示用 CDK 的
blob 包通过 S3 协议对接七牛的案例。

## 配置 AWS 鉴权参数

方法 1. 使用 `aws configure`

    
    
    # 确保 Python 3 和 pip3 已经正确安装
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install
    aws configure
    

填写 Qiniu Access Key ID 和 Qiniu Secret Key 即可

方法 2. 直接编写配置文件

编写 `~/.aws/credentials`

    
    
    [default]
    aws_access_key_id = <AccessKey>
    aws_secret_access_key = <SecretKey>
    

## 初始化 S3 bucket

在 Golang 程序中导入 Go CDK 包和 s3blob 驱动

    
    
    import (
      "gocloud.dev/blob"
      _ "gocloud.dev/blob/s3blob"
    )
    

初始化 S3 bucket 的代码为（这里的 `S3 Region Id` 和 `S3 Endpoint URL` 可以参考[服务域名
__](https://developer.qiniu.com/kodo/4088/s3-access-domainname)）

    
    
    values := url.Values{"awssdk": []string{"v2"}, "region": []string{"<S3 Region Id>"}, "endpoint": []string{"<S3 Endpoint URL>"}}
    bucket, err := blob.OpenBucket(ctx, "s3://<Bucket>?" + values.Encode())
    

## 从 S3 bucket 中列出对象

    
    
    iter := bucket.List(nil) // 这里可以额外填写 Delimiter 和 Prefix
    for {
    	object, err := iter.Next(ctx)
    	if err != nil {
    		if err == io.EOF {
    			break
    		}
    		return err
    	}
    	fmt.Printf("%s\n", object.Key)
    }
    

## 获取对象属性

    
    
    info, err := bucket.Attributes(context.Background(), objectName)
    if err != nil {
    	return err
    }
    fmt.Printf("Size: %d\n", info.Size)
    fmt.Printf("Content-Type: %s\n", info.ContentType)
    fmt.Printf("MD5: %#v\n", info.MD5)
    fmt.Printf("ETag: %#v\n", info.ETag)
    fmt.Printf("Metadata: %#v\n", info.Metadata)
    fmt.Printf("ModTime: %s\n", info.ModTime)
    

## 从对象中读取数据

    
    
    reader, err := bucket.NewReader(ctx, objectName, nil)
    if err != nil {
    	return err
    }
    defer reader.Close()
    

这里的 `reader` 实现了 `io.Reader`，`io.WriterTo`，`io.Seeker` 和 `io.Closer` 接口

## 将数据写入到对象中

    
    
    writer, err := bucket.NewWriter(ctx, objectName, &blob.WriterOptions{
    	ContentType: contentType,
    	Metadata: metadata,
    })
    if err != nil {
    	return err
    }
    defer writer.Close()
    

这里的 `writer` 实现了 `io.Writer`，`io.ReaderFrom` 和 `io.Closer` 接口

## 复制对象

    
    
    err = bucket.Copy(ctx, destObjectName, srcObjectName, nil)
    if err != nil {
    	return err
    }
    

## 删除对象

    
    
    err := bucket.Delete(ctx, objectNameToDelete)
    if err != nil {
    	return err
    }
    

## 生成对象下载 URL

    
    
    signedUrl, err := bucket.SignedURL(ctx, objectName, &blob.SignedURLOptions{Expiry: time.Minute, Method: http.MethodGet})
    if err != nil {
    	return err
    }
    fmt.Printf("GET URL: %s\n", signedUrl)
    

## 生成对象上传 URL

    
    
    signedUrl, err := bucket.SignedURL(ctx, objectName, &blob.SignedURLOptions{Expiry: time.Minute, Method: http.MethodPut})
    if err != nil {
    	return err
    }
    fmt.Printf("PUT URL: %s\n", signedUrl)
    

以上内容是否对您有帮助？