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

如何使用流解压Reqwest/Hyper响应?Rust流式处理ZIP下载与解压

在Rust中实现流式下载并提取ZIP文件中的指定文件

嗨,这事儿不难!咱们可以用Rust实现和你Node.js写法思路完全一致的流式处理——不用把整个60MB的ZIP先存到本地,边下载边解压,找到目标文件就直接写入。

首先得在你的Cargo.toml里加上必要的依赖:

[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }
zip = "0.6"

接下来是完整的实现代码,我会给你标注每一步的作用:

use std::fs::File;
use std::io::{self, Write};
use zip::read::StreamingZipReader;

fn main() -> io::Result<()> {
    // 发起阻塞式GET请求,获取ZIP文件的响应流(不会一次性加载整个60MB到内存)
    let mut response = reqwest::blocking::get("myfile.zip")?;

    // 用StreamingZipReader包装响应体,实现流式解压(不需要随机读取能力,完美适配HTTP流)
    let mut zip_reader = StreamingZipReader::new(response);

    // 遍历ZIP中的每个条目
    while let Some(mut entry) = zip_reader.next_entry()? {
        // 匹配我们需要的txt文件(题目说ZIP里只有唯一文件,找到就处理)
        if entry.name().ends_with(".txt") {
            println!("正在提取文件: {}", entry.name());
            
            // 创建本地输出文件
            let mut output_file = File::create("myfile.txt")?;
            
            // 流式复制条目内容到本地文件——边读解压后的内容边写,内存占用极低
            io::copy(&mut entry, &mut output_file)?;
            
            // 既然只有唯一文件,找到后直接退出循环,不用继续处理
            break;
        }
    }

    println!("提取完成!");
    Ok(())
}

和你Node.js写法的对应关系:

  • Node.js里的http.get → Rust的reqwest::blocking::get:都是发起HTTP请求获取文件流
  • response.pipe(unzip.Parse()) → StreamingZipReader::new(response):把输入流交给解压处理器,流式处理
  • on('entry', ...) → 遍历zip_reader.next_entry():逐个处理ZIP包中的文件条目
  • entry.pipe(fs.createWriteStream(...)) → io::copy(&mut entry, &mut output_file):流式复制文件内容,避免内存过载

小提示:

  • 如果你需要异步处理(比如在Tokio项目中),可以换成reqwest的异步客户端,配合tokio::fs和异步版的IO操作,逻辑是一样的
  • 代码里用了?来处理错误,比你原来写的unwrap更健壮,实际项目中可以根据需求添加自定义错误处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:29:44