融合接口

SDK提供封装好的融合接口s3manager.Uploader,方便用户实现分片上传的功能。

代码示例:

type TransDemo struct {
    uploader *s3manager.Uploader
}

func NewTransDemo() *TransDemo {
    region := "cn"
    config := &aws.Config{
        Credentials:      credentials.NewStaticCredentials(S3AccessKey, S3SecretKey, ""),
        Endpoint:         aws.String(S3EndPoint),
        S3ForcePathStyle: aws.Bool(true),
        DisableSSL:       aws.Bool(true),
        //LogLevel:         aws.LogLevel(aws.LogDebug),
        Region: aws.String(region),
        HTTPClient: &http.Client{
            Transport: &http.Transport{
                MaxConnsPerHost: 1000,
            },
        },
    }
    sess := session.Must(session.NewSession(config))

    p := &TransDemo{
        uploader: s3manager.NewUploader(sess),
    }
    return p
}

func (p *TransDemo) upload() {
    key := "ExampleObject.txt"
    file, _ := os.Open("E:/ExampleObject.txt")

    _, err := p.uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(S3Bucket),
        Key:    aws.String(key),
        Body:   file,
        ACL:    aws.String("private"),                  // 可以设置公共读public-read, 默认private
        ContentType: aws.String("application/octet-stream"), // 默认application/octet-stream
    })

    if err != nil {
        fmt.Println("err, ", err)
        return
    }
}

UploadInput可设置的参数如下:

参数 类型 说明 是否必要
ACL *string 配置上传对象的预定义的标准ACL信息,例如private,public-read,public-read-write等。
Body io.ReadSeeker 对象的数据。
Bucket *string 执行本操作的桶名称。
Key *string 上传文件到媒体存储服务后对应的key。PutObject操作支持将文件上传至文件夹,如需要将对象上传至"/folder"文件下,只需要设置Key="/folder/{exampleKey}“即可。
Metadata map[string]*string 对象的元数据信息。
Tagging *string 对象的标签信息,必须是URL请求参数的形式。例如,“Key1=Value1”。

关于Content-Type的配置

Content-Type用于标识文件的资源类型,比如image/pngimage/jpg 是图片类型,video/mpegvideo/mp4是视频类型,text/plaintext/html是文本类型, 浏览器针对不同的Content-Type会有不同的操作,比如图片类型可以预览,视频类型可以播放,文本类型可以直接打开。application/octet-stream类型会直接打开下载窗口。

有些用户反馈图片和视频无法预览的问题,主要就是Content-Type没有正确设置导致的;Content-Type参数需要用户主动设置,默认是application/octet-stream。在go sdk中,可以根据对象key值后缀扩展名来决定文件的Content-Type,参考代码如下,

func mimeType(key string) string {
	ext := path.Ext(key)
	if ext == "" {
		return ""
	}

	return mime.TypeByExtension(ext)
}