reqwest отправить составную форму с очень большим вложением

Как объясняется в этом ответе, можно использовать Body::wrap_stream(read_stream) для POST содержимого файла без предварительного считывания всего содержимого в память.

Как мы можем сделать то же самое в составе reqwest::multipart::Form? Следующий код не работает с ошибкой the trait `From<&mut dyn Stream<Item = std::result::Result<Vec<u8>, std::io::Error>>>` is not implemented for `Body` .

   let metadata_json = "{ \"file_owner\": \"bob smith\" }";
   let metadata_part = reqwest::multipart::Part::text(metadata_json);

   let read_stream : Stream<Item = std::io::Result<Vec<u8>> = my_file_stream;
   let stream_part = reqwest::multipart::Part::stream(read_stream);

   let multipart_form = reqwest::multipart::Form::new()
     .part("metadata", metadata_part)
     .part("file", stream_part);

Я попытался предоставить реализацию From, которая просто вызывает Body::wrap_stream, но это запрещено, поскольку ни From, ни Body не определены в моем собственном коде.


person Eric    schedule 17.03.2021    source источник


Ответы (1)


Я считаю, что вам нужно использовать Body::wrap_stream как это:

let stream_part = reqwest::multipart::Part::stream(Body::wrap_stream(read_stream));
person Enn Michael    schedule 17.03.2021
comment
Поток возвращает данные из C api, который извлекает по одному буферу за раз. Есть ли более идиоматический способ представления его данных? - person Eric; 18.03.2021
comment
Ах, прости. Нет, тогда вполне нормально. (Полагаю, вы также можете сгладить Vecs, но если для этого нет особой причины, тогда все в порядке.) Я соответствующим образом отредактировал свой ответ. - person Enn Michael; 18.03.2021