You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rust的reqwest解析multipart/form-data响应并保存PDF

处理reqwest返回的multipart/form-data响应并提取PDF文件

reqwest仅提供multipart请求构建能力,解析响应需借助第三方库,推荐使用multipart-parser,以下是完整实现流程:

1. 添加依赖

在Cargo.toml中引入所需依赖:

[dependencies]
reqwest = { version = "0.11", features = ["blocking", "headers"] }
multipart-parser = "0.10"

2. 完整代码实现

use reqwest::{blocking::Client, header::{AUTHORIZATION, CONTENT_TYPE}};
use multipart_parser::parse_multipart;
use std::fs::File;
use std::io::Write;

fn main() {
    let access_token = "your_access_token"; // 替换为实际的访问令牌
    let url = "https://example.com/rest/document/123";
    
    let client = Client::new();
    let res = client.get(url)
        .header(AUTHORIZATION, format!("Bearer {}", access_token))
        .send()
        .expect("请求API失败");

    // 从Content-Type头提取multipart分隔符(boundary)
    let content_type = res.headers()
        .get(CONTENT_TYPE)
        .expect("响应缺少Content-Type头")
        .to_str()
        .expect("Content-Type格式无效");
    let boundary = content_type.split("boundary=")
        .nth(1)
        .expect("无法从Content-Type中提取boundary");

    // 读取响应的二进制内容
    let body = res.bytes().expect("读取响应体失败");

    // 遍历multipart部件,找到目标PDF并保存到磁盘
    let mut parts = parse_multipart(&body, boundary.as_bytes())
        .expect("解析multipart响应失败");
    while let Some(part) = parts.next() {
        let part = part.expect("解析部件失败");
        if let Some(disposition) = part.content_disposition {
            if disposition.name == Some("document".to_string()) {
                let mut file = File::create("document.pdf").expect("创建文件失败");
                file.write_all(&part.data).expect("写入文件失败");
                println!("PDF文件已成功保存");
                break;
            }
        }
    }
}

关键说明

  • boundary提取:必须从响应的Content-Type头中动态获取分隔符,不能硬编码示例值,因为每次请求的boundary可能不同。
  • 部件定位:通过Content-Disposition的name字段匹配到名为document的部件,该部件包含PDF的二进制数据。
  • 错误处理:示例用expect简化代码,生产环境建议改用match或?(需将main函数返回类型改为Result<(), Box<dyn std::error::Error>>)来优雅处理各类异常。
  • 大文件优化:如果PDF文件体积较大,建议使用multipart-parser的流式解析API,避免一次性加载整个响应体到内存。

内容的提问来源于stack exchange,提问作者pfust75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:21:47