rust - 如何使用流解压缩 Reqwest/Hyper 响应?

标签 rust reqwest

我需要下载一个 60MB 的 ZIP 文件并提取其中的唯一文件。我想下载它并使用流提取它。我如何使用 Rust 实现这一点?

fn main () {
    let mut res = reqwest::get("myfile.zip").unwrap();
    // extract the response body to myfile.txt
}

在 Node.js 中我会做这样的事情:

http.get('myfile.zip', response => {
  response.pipe(unzip.Parse())
  .on('entry', entry => {
    if (entry.path.endsWith('.txt')) {
      entry.pipe(fs.createWriteStream('myfile.txt'))
    }
  })
})

最佳答案

reqwest你可以得到 .zip 文件:

reqwest::get("myfile.zip")

由于reqwest 只能用于检索文件,ZipArchive来自 zip crate 可用于拆包。无法将 .zip 文件流式传输到 ZipArchive,因为 ZipArchive::new(reader: R)需要 R 来实现 Read (由 reqwestResponse 实现)和 Seek ,它不是由 Response 实现的。

作为解决方法,您可以使用临时文件:

copy_to(&mut tmpfile)

作为File实现SeekReadzip可以在这里使用:

zip::ZipArchive::new(tmpfile)

这是所描述方法的一个工作示例:

extern crate reqwest;
extern crate tempfile;
extern crate zip;

use std::io::Read;

fn main() {
    let mut tmpfile = tempfile::tempfile().unwrap();
    reqwest::get("myfile.zip").unwrap().copy_to(&mut tmpfile);
    let mut zip = zip::ZipArchive::new(tmpfile).unwrap();
    println!("{:#?}", zip);
}

tempfile是一个方便的 crate,它可以让你创建一个临时文件,所以你不必想一个名字。

关于rust - 如何使用流解压缩 Reqwest/Hyper 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50471218/

相关文章:

rust - 如何发出 GET 请求并打印结果?

aws-lambda - 为什么当 openssl 不在依赖关系图中时,openssl 上的交叉编译构建会失败?

rust - 如何在 Rust 中 for_each 然后对它们进行计数?

rust - 如何使用Rust crate 'boolean_expression'来实现简单的逻辑电路?

rust - 我可以将可变切片引用重新分配给自身的子切片吗?

rust - 为什么 reqwest 不在此请求中返回内容长度?

process - 执行任何 bash 命令,立即获取 stdout/stderr 的结果并使用 stdin

rust - 如何通过serde中的内部字段将 `Option`设置为None?

python - 转换简单的Python请求将POST转换为Rust reqwest

rust - 使用新的异步/等待语法发送多组 HTTP 请求并控制工作人员数量的最快方法