gpt4 book ai didi

c++ - 如何使用 std::fstream 中 gz 压缩的文件的预签名 url 设置 AWS S3 HTTP 上传的内容长度?

转载 作者:可可西里 更新时间:2023-11-01 17:17:41 31 4
gpt4 key购买 nike

我必须上传一个带有 S3 为我创建的预签名 URL 的文件。为了节省空间和时间,我使用了将文件压缩为 .gz 格式的流。所以 S3 只接收 gz 文件。

我使用 AWS S3 CPP SDK . AWS::HttpClient 用于 HTTP 请求和 boost 用于压缩。

我在问自己如何正确设置 HTTP 请求的内容长度?一方面它是一个流,另一方面流将被压缩(gz),这使得它变得不容易。遗憾的是,我不知道该怎么做。

我尝试使用 seekg()tellg() 获取长度,但无法解决我的问题。

auto&& f = std::fstream{ filepath.string(), std::ios_base::in | std::ios_base::binary };

auto in = std::make_shared<boost::iostreams::filtering_stream<boost::iostreams::bidirectional>>();
in->push(boost::iostreams::combine(boost::iostreams::gzip_compressor(), boost::iostreams::gzip_decompressor()));
in->push(f);

req->AddContentBody(in);
//req->SetContentLength(); <-- How?
req->SetContentType("application/octet-stream");

auto res = MyHttpClient->MakeRequest(req); //upload stream

最佳答案

Content-Length 必须是实际发送的字节数。如果您在发送数据时动态压缩数据,那么显然您无法预先知道最终压缩后的大小来正确设置 Content-Length。幸运的是,您不必这样做,因为 S3 有一个 multipart upload API支持流式上传。参见 Can I stream a file upload to S3 without a content-length header? .

关于c++ - 如何使用 std::fstream 中 gz 压缩的文件的预签名 url 设置 AWS S3 HTTP 上传的内容长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54463657/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com