Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Rust – Add array in reqwest::blocking::multipart::Part

I need to send an array of images to an API using form-data, so I’m using a loop to add the images, but I’m getting an error.

fn main() {
    let json = r#"{
        "imgupload": ["/home/user/Pictures/image01.jpg", "/home/user/Pictures/image02.jpg"]
    }"#
    .to_string();

    let request = serde_json::from_str::<ProductRequest>(json.as_str()).unwrap();

    let mut form = reqwest::blocking::multipart::Form::new();

    let array = request.imgupload.unwrap();

    for file_path in array.iter() {
        let file_name = get_file_name(file_path);

        let part = get_request_part_from_file(&file_path, &file_name);

        form.part("imgupload[]", part);
    }
}

fn get_file_name(x: &String) -> String {
    let file_name = std::path::Path::new(x)
        .file_name()
        .unwrap()
        .to_str()
        .unwrap()
        .to_string();

    file_name
}

fn get_request_part_from_file(
    file_path: &String,
    file_name: &String,
) -> reqwest::blocking::multipart::Part {
    println!("{}", file_path);
    let part = reqwest::blocking::multipart::Part::file(file_path)
        .unwrap()
        .file_name(file_name.to_string());

    part
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ProductRequest {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub imgupload: Option<Vec<String>>,
}

But I get the following error in form.part("imgupload[]", part); when trying to add reqwest::blocking::multipart::Part

enter image description here

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

What is the correct way to resolve this?

>Solution :

The part method on reqwest::blocking::multipart::Form takes ownership of self and returns a new Form with the part added.

Since it takes ownership of self you can not re-use the form variable after calling .part on it.

To fix your code you can re-assign form to the new Form taht .part returns:

fn main() {
    let json = r#"{
        "imgupload": ["/home/user/Pictures/image01.jpg", "/home/user/Pictures/image02.jpg"]
    }"#
    .to_string();

    let request = serde_json::from_str::<ProductRequest>(json.as_str()).unwrap();

    let mut form = reqwest::blocking::multipart::Form::new();

    let array = request.imgupload.unwrap();

    for file_path in array.iter() {
        let file_name = get_file_name(file_path);

        let part = get_request_part_from_file(&file_path, &file_name);

        form = form.part("imgupload[]", part);
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading