当前位置: 首页 > 知识库问答 >
问题:

通过V2 SDK完成AWS SDK MultiPartUpload时出现XML错误

钱跃
2023-03-14

我需要使用SignedURL上传到S3存储桶。我还需要上传多部分文件。我有一个golang API,它提供:

  • 多部件上载
  • 每个部件的签名URL
  • 完成多部分上传
  • 中止多部分上载

我正在尝试完成多部分上载。我有一个webendpoint,它接受来自swift 5客户端的输入:

type CompletedPart struct {
    Etag string
    PartNumber int
}

type CompleteMultipartUploadRequest struct {
    BucketName string
    Key string
    UploadID string
    MultipartUpload []CompletedPart
}

func putObjectMultipartComplete(w http.ResponseWriter, r *http.Request)  {
    var completeMultipartUploadRequest CompleteMultipartUploadRequest

    err := json.NewDecoder(r.Body).Decode(&completeMultipartUploadRequest)
    if err != nil {
        http.Error(w, fmt.Sprintf("unable to decode request: %s", err.Error()), http.StatusBadRequest)
        return
    }

    var completedParts []types.CompletedPart

    for _, part := range completeMultipartUploadRequest.MultipartUpload {

        temp := types.CompletedPart{
            ETag:       aws.String(part.Etag),
            PartNumber: int32(part.PartNumber),
        }

        completedParts = append(completedParts, temp)
    }

    input := &s3.CompleteMultipartUploadInput{
        Bucket:              aws.String(completeMultipartUploadRequest.BucketName),
        Key:                 aws.String(completeMultipartUploadRequest.Key),
        UploadId:            aws.String(completeMultipartUploadRequest.UploadID),
        MultipartUpload:     &types.CompletedMultipartUpload {
            Parts: completedParts,
        },
    }

    client := s3Client()

    response, err := client.CompleteMultipartUpload(context.TODO(), input)
    if err != nil {
        log.Println(err.Error())
        http.Error(w, fmt.Sprintf("could not complete multipart upload: %s", err.Error()), http.StatusFailedDependency)
        return
    }

    object := CompleteMultipartUploadResponse{
        BucketName: aws.ToString(response.Bucket),
        Key: aws.ToString(response.Key),
        Etag: aws.ToString(response.ETag),
    }

    json, err := json.Marshal(object)

    w.Header().Set("Content-Type", "application/json")
    w.Write(json)
}

我拿回了424。当我检查服务器日志中的错误时,我得到:

2022/02/01 16:39:29操作错误S3: CompleteMultipartUpload, https响应错误StatusCode: 400, Request estID: QREDACTE9, HostID: OdE2MREDACThk=, api错误MalformedXML:您提供的XML格式不正确或未针对我们发布的模式进行验证

我错过了什么?

共有1个答案

景阳平
2023-03-14

这段代码最终几乎是正确的。AWS S3 API提到零件号ID必须是一个整数。我不得不从1开始计数,而不是从0开始计数,因为发送带有数字0的零件是无效的。

 类似资料:
  • 我正在使用docker compose容器部署3个项目:Eureka、Zuul服务和应用程序。以下是这些项目的配置: 尤里卡: 祖尔: 应用 当我做docker组装时,它正确地旋转容器,没有错误。然而,当我使用API网关调用RESTendpoint时,我得到了一个错误:com。netflix。祖尔。例外ZuuleException:转发错误

  • 以下是我的问题陈述: XYZ学校希望将学生和教职员工的详细信息存储在xml文件中。以下场景有助于设计XML文档。persons将是根标签。每个人都有姓名、年龄、性别、地址的条目。一个人可以是学生也可以是教职员工。学生将有rollno、standard和section。如果是工作人员,则标记和主题。每个人都必须有一个带有以下条目的地址-门牌号、街道、城市和州。 我写的代码如下: ] 它给出了错误-异

  • 我需要一些帮助 我在我的proyect Spring Boot上使用JPA存储库和数据库是SQL Server2012;我的所有存储库都运行良好,但我在删除下一个查询时遇到了问题:

  • Iam正在尝试对HTTPS url进行API调用: 我面临着以下错误。当我通过cUrl或Postman调用API时,它工作得很好。。。 回溯(最后一次调用):文件“C:\Users\user\AppData\Local\Programs\Python\Python 35-32\lib\site packages\urlib3\connectionpool.py”,urlopen chunked=c

  • Brew安装,显示此错误。请原谅我的无知,我是Mac的新手。 请报告此错误:http://git.io/brew-troubleshootin/System/Library/Frameworks/Ruby。framework/Versions/2.0/usr/lib/ruby/2.0。0/rubygems/core\u ext/kernel\u require。rb:55:inrequire'/u

  • 我使用PHP CURL发送POSTFIELD,但我得到错误415不支持的媒体类型这是我的代码: 我收到错误信息 HTTP/1.1 415不支持的媒体类型日期:周三,01月2018 18:19:00格林尼治标准时间服务器:Apache缓存控制:无缓存缓存控制:无存储Pragma:无缓存内容长度: 903过期:周四,01月1970 00:00:00格林尼治标准时间设置-Cookie: WMONID=R