gpt4 book ai didi

rust - 如何使用reqwest发布文件?

转载 作者:行者123 更新时间:2023-12-03 11:33:39 25 4
gpt4 key购买 nike

reqwest v0.9.18的文档显示了以下发布文件的示例:

let file = fs::File::open("from_a_file.txt")?;
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
.body(file)
.send()?;
reqwest v0.11的最新文档不再包含此示例,并且在调用 body()时尝试构建它失败,并显示以下错误:
the trait `From<std::fs::File>` is not implemented for `Body`
发送文件的更新方法是什么?

最佳答案

您要链接的特定示例在使用异步的 reqwest crate之前。如果要使用该确切示例,则需要使用 reqwest::Client 而不是 reqwest::blocking::Client 。这也需要启用blocking功能。
需要说明的是,您实际上仍然可以找到该示例,它只是位于 reqwest::blocking::RequestBuilder body() 方法的文档中。

// reqwest = { version = "0.11", features = ["blocking"] }
use reqwest::blocking::Client;
use std::fs::File;

fn main() -> Result<(), Box<dyn std::error::Error>> {
let file = File::open("from_a_file.txt")?;

let client = Client::new();
let res = client.post("http://httpbin.org/post")
.body(file)
.send()?;

Ok(())
}
还要检查 reqwest Form RequestBuilder multipart() 方法,因为例如 file() 方法。

如果确实要使用异步,则可以使用 FramedRead 中的 tokio-util crate。与 TryStreamExt 一起的 futures crate特性。
只需确保为 stream启用 reqwest功能,为 codec启用 tokio-util功能。
// futures = "0.3"
use futures::stream::TryStreamExt;

// reqwest = { version = "0.11", features = ["stream"] }
use reqwest::{Body, Client};

// tokio = { version = "1.0", features = ["full"] }
use tokio::fs::File;

// tokio-util = { version = "0.6", features = ["codec"] }
use tokio_util::codec::{BytesCodec, FramedRead};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let file = File::open("from_a_file.txt").await?;

let client = reqwest::Client::new();
let res = client
.post("http://httpbin.org/post")
.body(file_to_body(file))
.send()
.await?;

Ok(())
}

fn file_to_body(file: File) -> Body {
let stream = FramedRead::new(file, BytesCodec::new());
let body = Body::wrap_stream(stream);
body
}

关于rust - 如何使用reqwest发布文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65814450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com