rust - 传递给 reqwest::multipart::Part::reader 的内容

标签 rust

我正在尝试使用 reqwest crate 上传文件(名称是从命令行参数动态检索的)。 我需要使用多部分形式上传文件。因为我想分块上传大文件,所以我猜我需要使用 reqwest::multipart::Part::readerreqwest::multipart::Part::字节。但是这两个期望值都具有 'static 生命周期。 如何将我的文件转换为合适的格式以使用这些方法并获得预期的生命周期?

最佳答案

小心生命周期。 request::multipart::Part::reader'static lifetime 不在argument borrow 上,而是在type 上。要求是类型定义在函数的生命周期内仍然存在,这是一个非常容易实现的要求。不参与 reqwest::multipart 的使用实际上是从外部借用任何东西而没有在内部复制。

在实践中,Read 的任何实例将满足 reqwest 的多部分 reader方法,允许您传递任意读者,甚至是您自己生成的读者。

在您的特定情况下,您将上传一个大文件。我会故意假装你正在传递一个读者(因为你特别要求查看如何使用这种方法)而不是仅仅使用 Part::file ,这正是我即将向您展示的内容。

首先,我们要打开我们的文件:

let reader = std::fs::File::open("test.txt")?;

没什么奇怪的,值得注意的是 File工具 Read .

然后我们创建我们的 Part :

let part = reqwest::multipart::Part::reader(reader).file_name("foobar");

我一路上设置了文件名。从这里,我们创建我们的 Form ,因为这就是我们要发送的内容。请注意 Part我们之前创建的被移动到这个结构中:

let form = reqwest::multipart::Form::new();
let form = form.part("test", part);

然后我们发送请求:

let client = reqwest::Client::new();
let resp = client
    .post("http://localhost/foobar")
    .multipart(form)
    .send().map_err(|e| io::Error::new(io::ErrorKind::InvalidData, "Invalid server return"))?;

果然,它成功了!

enter image description here

文件包含foobar (6 个字节,如屏幕截图所示)。

关于rust - 传递给 reqwest::multipart::Part::reader 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57732378/

相关文章:

rust - 在另一个线程中从 `panic!` 恢复

rust - 确保 Rust 中的特征实现满足属性

ios - rust-openssl 在 --target=i386-apple-ios 时无法构建 bin(iOS 模拟器)

c - Rust 和 C 与最小程序和 no_std 的链接问题

data-structures - Rust 中的树遍历 vs Borrow Checker

rust - 如何检查两个引用变量是否借用同一个对象?

rust - 将字符串拆分为偏移子字符串的功能方法

rust - 在读取文件时配置换行符

c - 如何通过 FFI 静态链接相互依赖的 Rust 和 C 源代码?

closures - 如何将捕获的变量移动到闭包内的闭包中?