当我使用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
}
答案 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的FPutObject
和PutObject
api将multi-part put
和single part put
都抽象到这些API中。对于multi-part
PUT,每个部分将根据连接类型设置X-Amz-Content-Sha256
或Content-Md5
。由于呼叫是抽象的,因此用户无法设置Content-Md5
。
我相信IBM Cloud Object Storage
存在一个错误,因为即使未设置Content-Md5
也不应出错。