• 3、AWS SDK for Go使用


    简介

    文档地址

    s3文档
    https://docs.aws.amazon.com/zh_cn/s3/?id=docs_gateway
    s3 sdk for go文档:
    https://docs.aws.amazon.com/zh_cn/sdk-for-go/index.html

    会话并发安全

    只要会话没有被修改,会话就可以安全地并发使用。创建会话后,SDK 不会修改会话。从共享会话同时创建服务客户端是安全的。

    客户端可以在复用会话配置的基础上覆盖自己的配置

    创建服务客户端时,可以传入自定义配置,这样就不需要为每个配置创建会话。SDK 合并这两个配置,用您的自定义配置覆盖会话值。例如,在以下代码段中,Amazon S3 客户端使用 会话,但使用自定义值 ( )mySession覆盖该字段:Regionus-west-2

    svc := s3.New(mySession, aws.NewConfig().WithRegion("us-west-2"))
    
    • 1

    一些返回值记得Close

    一些 API 操作返回一个响应结构,其中包含Body一个 io.ReadCloser.请务必 Close。

    resp, err := s3svc.GetObject(&s3.GetObjectInput{...})
    if err != nil {
        // handle error
        return
    }
    // Make sure to always close the response Body when finished
    defer resp.Body.Close()
    
    decoder := json.NewDecoder(resp.Body)
    if err := decoder.Decode(&myStruct); err != nil {
        // handle error
        return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    并发的客户端使用

    您可以创建同时使用同一个服务客户端发送多个请求的 goroutine。您可以根据需要使用带有任意数量的 goroutine 的服务客户端。但是,您不能同时修改服务客户端的配置和请求处理程序。如果这样做,服务客户端操作可能会遇到竞争条件。在同时使用服务客户端之前定义它。

    支持分页

    使用aws s3 sdk for go访问oss

    注意点:
    S3ForcePathStyle: aws.Bool(false), 设置为false,使用virtual hosted style ,而不是pathstyle。
    使用说明参考:2、使用S3协议访问OSS
    比较OSS对象的MD5值和文件MD5值

    package main
    
    import (
    	"context"
    	"crypto/md5"
    	"encoding/hex"
    	"fmt"
    	"github.com/aws/aws-sdk-go/aws"
    	"github.com/aws/aws-sdk-go/aws/credentials"
    	"github.com/aws/aws-sdk-go/aws/session"
    	"github.com/aws/aws-sdk-go/service/s3"
    	"io/ioutil"
    	"strings"
    	"time"
    )
    
    var (
    	accessKey               = "xxx"       //""
    	secretKey               = "xxx" //""
    	region                  = "oss-cn-beijing"
    	endpoint                = "oss-cn-beijing.aliyuncs.com"
    	timeout   time.Duration = time.Second * 5
    )
    
    func main() {
    	sess, err := session.NewSession(&aws.Config{
    		Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
    		Endpoint:    aws.String(endpoint),
    		Region:      aws.String(region),
    		//minio:true,oss:false
    		S3ForcePathStyle: aws.Bool(false),
    	})
    	if err != nil {
    		panic(err)
    	}
    	svc := s3.New(sess)
    	//比较OSS对象中的MD5和自己生成的MD5值
    	compareMD5(svc, "bkt-bj1", "1.jpg")
    }
    
    func compareMD5(svc *s3.S3, bucket, key string) {
    	ctx, cancelFn := context.WithTimeout(context.Background(), timeout)
    	if cancelFn != nil {
    		defer cancelFn()
    	}
    
    	object, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{
    		Bucket: aws.String(bucket),
    		Key:    aws.String(key),
    	})
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("object.ETag:", *object.ETag)
    	fmt.Printf("object:%+v\n", object)
    
    	defer object.Body.Close()
    	all, err := ioutil.ReadAll(object.Body)
    	if err != nil {
    		panic(err)
    	}
    	myFileMD5 := md5Encode(all)
    	//OSS 的MD5为大写,ETag字符串两边带有双引号,比较前去掉"
    	ossObjectMD5 := strings.Trim(*object.ETag, "\"")
    	fmt.Println("myFileMD5:", myFileMD5)
    	fmt.Println("ossObjectMD5:", ossObjectMD5)
    
    	fmt.Println(strings.ToLower(ossObjectMD5) == myFileMD5)
    
    }
    
    // MD5加密
    func md5Encode(arg0 []byte) string {
    	h := md5.New()
    	h.Write(arg0)
    	cipherStr := h.Sum(nil)
    	// 输出加密结果
    	return strings.ToLower(hex.EncodeToString(cipherStr))
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    输出结果

    object.ETag: "9AFE56527B03F0391E268A976AB48E1E"
    object:{                                       
      AcceptRanges: "bytes",                       
      Body: buffer(0xc000384080),
      ContentLength: 391703,                       
      ContentType: "image/jpeg",                   
      ETag: "\"9AFE56527B03F0391E268A976AB48E1E\"",
      LastModified: 2022-07-26 01:41:24 +0000 UTC, 
      StorageClass: "STANDARD"                     
    }                                              
    myFileMD5: 9afe56527b03f0391e268a976ab48e1e
    ossObjectMD5: 9AFE56527B03F0391E268A976AB48E1E
    true  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    笔记本Win 10系统查看电池健康状况
    Vue2【webpack 的基本使用、webpack 中的插件、webpack 中的 loader、打包发布、Source Map】
    bert ranking listwise demo
    mybatsi-plus笔记
    php 反射
    junctions_skeleton
    python协整与异步调用,压榨程序的摸鱼时间——使用异步编写需要循环执行的程序,并获取返回值(2)
    无线局域网(WLAN)简单概述
    Java面试题:请谈谈Java中的volatile关键字?
    Dock搭建FTP文件服务器
  • 原文地址:https://blog.csdn.net/Edu_enth/article/details/125989956