rust - 传递给 reqwest::multipart::Part::reader 的内容
问题描述
我正在尝试使用板条箱上传文件(名称是从命令行参数动态检索的)reqwest
。我需要使用多部分表单来上传文件。而且由于我想分块上传大文件,我猜我需要使用reqwest::multipart::Part::reader
or 或reqwest::multipart::Part::bytes
. 但是这两个期望值都具有'static
生命周期。如何将我的文件转换为合适的格式以使用这些方法并获得预期的生命周期?
解决方案
认真对待一生。request::multipart::Part::reader
的'static
生命周期不在于参数借用,而在于类型。要求是类型定义在函数的生命周期内仍然存在,这是一个非常容易满足的要求。没有在reqwest::multipart
内部复制的情况下实际从外部借用任何东西。
在实践中,任何实例都Read
将满足 reqwest 的 multipartreader
方法,允许您传递任意阅读器,甚至是您自己生成的阅读器。
在您的特定情况下,您将上传一个大文件。我将故意假装您正在通过一个读者(因为您特别要求了解如何使用此方法),而不是仅使用 using Part::file
,这正是我将要向您展示的内容。
首先,我们将打开我们的文件:
let reader = std::fs::File::open("test.txt")?;
没什么好奇怪的,值得注意的是File
implements 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 个字节,如屏幕截图所示)。