如何在Minio SDK中设置Content-MD5标头以上传到IBM Cloud Object Storage?

时间:2018-07-03 17:45:21

标签: go ibm-cloud minio

当我使用Minio Golang SDK将文件上传到S3时,我试图设置Content-MD5标头。我可以成功将文件上传到AWS而无需设置Content-MD5,但是上传到IBM Cloud Object Storage失败,并出现以下错误:

ERR: Object write failed, reason: Missing required header for this request: Content-MD5

根据Minio SDK,
https://docs.minio.io/docs/golang-client-api-reference#FPutObject
我使用minio.PutObjectOptions中的UserMetadata字段设置Content-MD5,但是IBM Cloud Object Storage一直抱怨缺少MD5,我在做什么吗?以下代码有问题吗?

func (cloudIO *CloudIO) FWrite(name string) (n int, err error) {
    f, err := os.Open(name)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    h := md5.New()
    if _, err := io.Copy(h, f); err != nil {
        log.Fatal(err)
    }

    bytesWritten, err := cloudIO.client.FPutObject(cloudIO.bucket, cloudIO.address,
        name,
        minio.PutObjectOptions{UserMetadata: map[string]string{"Content-MD5": hex.EncodeToString(h.Sum(nil))}})
    return int(bytesWritten), err
}

1 个答案:

答案 0 :(得分:0)

@pacalj如果您查看PutObject https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html的AWS文档。 Content-MD5不是必填字段。这意味着,如果客户端未设置它,则服务器不应出错,就像您已经在AWS S3中看到的那样。就minio-go sdk而言,无法按照https://docs.minio.io/docs/golang-client-api-reference#FPutObject

中的说明通过content-MD5设置PutObjectOptions

X-Amz-Content-Sha256连接的情况下Minio-go设置http,在Content-Md5连接的情况下https。 Minio-go的FPutObjectPutObject api将multi-part putsingle part put都抽象到这些API中。对于multi-part PUT,每个部分将根据连接类型设置X-Amz-Content-Sha256Content-Md5。由于呼叫是抽象的,因此用户无法设置Content-Md5

我相信IBM Cloud Object Storage存在一个错误,因为即使未设置Content-Md5也不应出错。