我使用reqwest
将jar文件发送到使用multipart
的api。这就是我目前所拥有的:
use std::path::PathBuf;
use anyhow::Result;
use reqwest::{multipart, Body, Client};
use tokio::fs::File;
use tokio_util::codec::{BytesCodec, FramedRead};
pub async fn upload_file(client: &reqwest::Client, fpath: &PathBuf) -> Result<()> {
let url = "my.url.com/v1";
let file = File::open(&fpath).await?;
let stream = FramedRead::new(file, BytesCodec::new());
let body = Body::wrap_stream(stream);
let some_file = multipart::Part::stream(body)
.file_name("asdf.jar") // <- Problem here!
.mime_str("application/x-java-archive")?;
let form = multipart::Form::new().part("jarfile", some_file);
client
.post(url)
.multipart(form)
.send()
.await?
.error_for_status()?;
Ok(())
此代码按预期运行,文件已上载,但名称为asdf.jar
。我想根据fpath: PathBuf
变量动态设置文件名,但我对multipart::Part
的file_name
方法有问题。它接受类型Into<Cow<'static, str>>
,但生命周期在这里给我带来了麻烦。我是在尝试做API不支持的事情,还是遗漏了什么?
我意识到我可以使用好的ol'String
。我提取的文件名如下:
let fname = fpath
.file_name()
.unwrap()
.to_os_string()
.into_string()
.ok()
.unwrap();
let some_file = multipart::Part::stream(body)
.file_name(fname) // <- Problem solved!
.mime_str("application/x-java-archive")?;