【问题标题】:reqwest send multipart form with very large attachmentreqwest 发送带有非常大附件的多部分表单
【发布时间】:2021-03-17 21:15:59
【问题描述】:

正如this answer 解释的那样,可以使用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

【问题讨论】:

    标签: rust reqwest


    【解决方案1】:

    我相信你需要像这样使用Body::wrap_stream

    let stream_part = reqwest::multipart::Part::stream(Body::wrap_stream(read_stream));
    

    【讨论】:

    • 流从 C api 返回数据,一次检索一个缓冲区。有没有更惯用的方式来表示其数据?
    • 啊,对不起。不,那完全没问题。 (我想您也可以将Vecs 展平,但如果没有特别的理由这样做,那么它完全可以。)我已经相应地编辑了我的答案。
    最近更新 更多