1

我正在尝试使用 POST 请求reqwest。我需要在我的请求中发送附件。我正在寻找相当于

curl -F attachment=@file.txt

在旧版本中(见这里)它很简单

let file = fs::File::open("much_beauty.png")?;
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .headers(construct_headers())
    .body(file)
    .send()?;

但是对于较新的版本(请参见此处),该功能似乎已被删除。我得到错误:

21 |         .body(file)
   |          ^^^^ the trait `From<File>` is not implemented for `Body`
   |
   = help: the following implementations were found:
             <Body as From<&'static [u8]>>
             <Body as From<&'static str>>
             <Body as From<Response>>
             <Body as From<String>>
           and 2 others
   = note: required because of the requirements on the impl of `Into<Body>` for `File`

尽管官方文件声称

基本的方法是使用body()a 的方法RequestBuilder。这使您可以设置正文应该是什么的确切原始字节。它接受各种类型,包括StringVec<u8>File

4

1 回答 1

2

新的 API 可能不再实现From<File>forBody但确实实现From<Vec<u8>>了 forBody并且我们可以轻松地将 aFile转换为Vec<u8>.

事实上,标准库中已经有一个方便的函数调用std::fs::read,它将读取整个文件并将其存储在Vec<u8>. 这是更新的工作示例:

let byte_buf: Vec<u8> = std::fs::read("much_beauty.png")?;
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .headers(construct_headers())
    .body(byte_buf)
    .send()?;
于 2021-02-14T11:39:25.430 回答