Как установить длину содержимого для загрузки AWS S3 HTTP с заранее заданным URL-адресом для файла, сжатого gz в std :: fstream? - PullRequest
0 голосов
/ 31 января 2019

Мне нужно загрузить файл с заранее заданным URL-адресом, который S3 создает для меня.Чтобы сэкономить место и время, я использую поток, который сжимает файл в формате .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

1 Ответ

0 голосов
/ 31 января 2019

Content-Length должно быть фактическим количеством отправляемых байтов.Если вы сжимаете данные динамически во время отправки, то, очевидно, вы не можете знать окончательный сжатый размер заранее, чтобы правильно установить Content-Length.К счастью, в этом нет необходимости, так как S3 имеет API многоэтапной загрузки , который поддерживает потоковую загрузку.См. Могу ли я загрузить потоковое видео на S3 без заголовка длины содержимого? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...