首页 > 解决方案 > 传递给 reqwest::multipart::Part::reader 的内容

问题描述

我正在尝试使用板条箱上传文件(名称是从命令行参数动态检索的)reqwest。我需要使用多部分表单来上传文件。而且由于我想分块上传大文件,我猜我需要使用reqwest::multipart::Part::readeror 或reqwest::multipart::Part::bytes. 但是这两个期望值都具有'static生命周期。如何将我的文件转换为合适的格式以使用这些方法并获得预期的生命周期?

标签: rust

解决方案


认真对待一生。request::multipart::Part::reader'static生命周期不在于参数借用,而在于类型。要求是类型定义在函数的生命周期内仍然存在,这是一个非常容易满足的要求。没有在reqwest::multipart内部复制的情况下实际从外部借用任何东西。

在实践中,任何实例都Read将满足 reqwest 的 multipartreader方法,允许您传递任意阅读器,甚至是您自己生成的阅读器。

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

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

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

没什么好奇怪的,值得注意的是Fileimplements 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"))?;

而且,果然,它奏效了!

在此处输入图像描述

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


推荐阅读