如何使用“传输编码:分块”将对象上传到 AWS S3

Ric*_*rdT 7 amazon-s3 amazon-web-services

我正在使用 c++ 的 awssdk 将数据上传到 S3 存储桶。PutObject()我正在使用类的方法Aws::S3::S3Client来上传数据。

但是,在上传数据之前,我需要知道我正在上传的数据的内容长度。我需要在请求中设置内容长度(请求的类型为Aws::S3::Model::PutObjectRequest)。或者 awssdk 库将尝试自行确定主体的大小(awssdk 通过查找有效负载数据的末尾来读取其大小来实现这一点)。

不管怎样,就我而言,我还不知道我正在上传的数据的内容长度。我正在开发一个压缩数据的服务器。我必须等待压缩结束才能知道压缩数据的最终大小。我不想等那个。相反,我想在生成压缩数据时开始上传到 S3。可以做到的方法是在向 S3 服务器发送 HTTP post 请求时使用“Transfer-Encoding: chunked”。

有没有办法使用Aws::S3::S3Client“Transfer-Encoding: chunked”上传数据?*

我已经下载了 c++ 的 awssdk 源代码,我对其进行了一些调整以强制在 http 请求中发送“Transfer-Encoding: chunked”。但S3服务器返回HTTP错误代码501 NotImplemented:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>NotImplemented</Code>
    <Message>A header you provided implies functionality that is not implemented</Message>
    <Header>Transfer-Encoding</Header>
    <RequestId>8F55B09D484DD66C</RequestId>
    <HostId>gZk6zaPcObsTfclz0zXvKGtPT5udzDKigIrm7laD3csG30vhx3pa0eFFS8nh6t9k7XkDeJRm9Z4=</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)