我在使用Minio Golang SDK将文件上传到S3时尝试设置Content-MD5标头。我可以在不设置Content-MD5的情况下将文件成功上传到AWS,但是上传到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
}

最佳答案

@pacalj如果您查看AWS文档PutObject https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.htmlContent-MD5不是必填字段。这意味着,如果客户端未设置它,则服务器不应出错,就像您已经在AWS S3中看到的那样。就minio-go sdk而言,无法按照https://docs.minio.io/docs/golang-client-api-reference#FPutObject中的说明通过content-MD5设置PutObjectOptions
Minio-go在X-Amz-Content-Sha256连接的情况下设置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也不应该出错。

10-08 12:46