rust reqwest -动态确定multipart::Part的文件名

epfja78i  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(124)

我使用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不支持的事情,还是遗漏了什么?

eit6fx6z

eit6fx6z1#

我意识到我可以使用很好的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")?;

相关问题