Go 如何在Minio SDK中设置Content-MD5标头以上载到IBM云对象存储?

Go 如何在Minio SDK中设置Content-MD5标头以上载到IBM云对象存储?,go,ibm-cloud,minio,Go,Ibm Cloud,Minio,当我使用Minio Golang SDK将文件上载到S3时,我试图设置Content-MD5头。我可以在不设置Content-MD5的情况下成功地将文件上载到AWS,但上载到IBM Cloud Object Storage失败,出现以下错误: 错误:对象写入失败,原因:缺少此请求所需的头:Content-MD5 根据Minio SDK,我使用Minio.PutObjectOptions中的UserMetadata字段来设置Content-MD5,但IBM Cloud Object Storag

当我使用Minio Golang SDK将文件上载到S3时,我试图设置Content-MD5头。我可以在不设置Content-MD5的情况下成功地将文件上载到AWS,但上载到IBM Cloud Object Storage失败,出现以下错误:

错误:对象写入失败,原因:缺少此请求所需的头:Content-MD5
根据Minio SDK,

我使用Minio.PutObjectOptions中的UserMetadata字段来设置Content-MD5,但IBM Cloud Object Storage一直抱怨缺少MD5,我在下面的代码中是否有错误

func(cloudIO*cloudIO)FWrite(名称字符串)(n int,err error){
f、 错误:=操作系统打开(名称)
如果错误!=零{
log.Fatal(错误)
}
延迟f.关闭()
h:=md5.New()
如果2;,err:=io.Copy(h,f);err!=nil{
log.Fatal(错误)
}
BytesWrited,err:=cloudIO.client.FPutObject(cloudIO.bucket,cloudIO.address,
名称
minio.PutObjectOptions{UserMetadata:map[string]string{“Content-MD5”:hex.EncodeToString(h.Sum(nil))})
返回int(bytesWrited),err
}

@pacalj如果您查看AWS文档中的
PutObject
<代码>内容-MD5不是必填字段。这意味着,如果不是由客户机设置的,服务器就不会出错,正如您在AWS S3中已经看到的那样。就
minio-go
sdk而言,
content-MD5
无法通过
PutObjectOptions
进行设置,如中所述

Minio go在
http
连接的情况下设置
X-Amz-Content-Sha256
,在
https
连接的情况下设置
Content-Md5
。Minio go的
FPutObject
PutObject
api将
多部分put
单部分put
抽象到这些api中。在
multi-part
PUT的情况下,每个部分将根据连接类型设置
X-Amz-Content-Sha256
Content-Md5
。由于调用是抽象的,因此用户无法设置
Content-Md5


我相信
IBM云对象存储
有一个bug,因为它不应该出错,即使未设置
Content-Md5

查看源代码,我认为应该自动添加此Md5。像您那样将其作为自定义头提供,它将不会到达最终的传出请求,但密钥的前缀将是
“X-Amz-Meta-”
(如中所示)。总之,这可能是一个bug,您应该报告它。@icza谢谢。我在你提到的go文件中看到了完全相同的东西。我正在尝试捕获数据包,以验证Content-MD5是否丢失在其中。谢谢您的回答。我得出了相同的结论,因为Content-Md5不能由用户设置,它将被绕过,而不会添加到标题中,从而导致错误。我修改了Minio go sdk以增加对IBM COS的兼容性,现在它解决了这个问题。但我同意这可能是IBM方面的一个缺陷。