c++ - 如何为在 std::fstream 中进行 gz 压缩的文件设置带有预签名 URL 的 AWS S3 HTTP 上传的内容长度?
问题描述
我必须上传一个带有 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 具有支持流式上传的分段上传 API。请参阅我可以在没有内容长度标头的情况下将文件上传到 S3 吗?.
推荐阅读
- python - 从 Bittrex 解析 JSON
- jhipster - JHipster:为什么会为 --skip-client 标志生成 node_modules 和其他前端文件?
- uiviewcontroller - How to send data from AppDelegate to my subclass of ViewController in swift 4
- asp.net-mvc - 为生产设置 compliation debug = false
- objective-c - What is the Objective-c equivalent of the Swift customAnnotation.coordinateMode = .relativeY
- sql - Use field values inside a Where statement
- spss - 标准误差中位生存时间 SPSS
- android - Android Proguard 使用获取登录 apk 错误
- javascript - 在返回之前从多个 HTTP GET 请求中获取数据
- ssis - VS 2017 中的 SSIS 在 SQL 任务上返回错误