动态确定multipart::Part的文件名



我使用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::Partfile_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")?;

最新更新