【问题标题】:How can I set Content-MD5 header in Minio SDK for uploading to IBM Cloud Object Storage?如何在 Minio SDK 中设置 Content-MD5 标头以上传到 IBM Cloud Object Storage?
【发布时间】:2018-12-12 02:34:05
【问题描述】:

我在使用 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
}

【问题讨论】:

  • 查看源代码,在我看来这个 MD5 应该是自动添加的。像您一样将其作为自定义标头提供,它不会到达最终的传出请求,但密钥将以"X-Amz-Meta-" 为前缀(如api-put-object.go / Header() method 所示)。所以总而言之,这可能是一个错误,你应该报告它。
  • @icza 谢谢。我在你提到的 go 文件中看到了完全相同的内容。我正在尝试捕获数据包以验证其中是否缺少 Content-MD5。

标签: go ibm-cloud minio


【解决方案1】:

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

Minio-go 在http 连接的情况下设置X-Amz-Content-Sha256,在https 连接的情况下设置Content-Md5。 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 没有设置。

【讨论】:

  • 感谢您的出色回答。我想出了与用户无法设置 Content-Md5 相同的结论,它将被绕过并且不会添加到标题中,从而导致错误。我修改了 Minio-go sdk 以增加对 IBM COS 的兼容性,现在它解决了这个问题。但我同意这可能是 IBM 方面的一个错误。
【解决方案2】:

您也可以使用 minio Core 代替 Client 来设置 MD5 和 SHA256 标头。作为documentation saysCore

NewCore - 返回新初始化的 Core 客户端,这个 CoreClient 应仅在需要访问等特殊条件下使用 较低的原语并能够使用它们来编写自己的 包装器。

它有一个PutObject method,其中包含md5Base64sha256Hex 参数。

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2019-01-18
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多