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

时间:2018-05-22 15:19:08

标签: 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'))
    }
  })
})

2 个答案:

答案 0 :(得分:4)

使用reqwest,您可以获得.zip文件:

reqwest::get("myfile.zip")

由于reqwest只能用于检索文件,因此ZipArchive包中的zip可用于解包。由于ZipArchive::new(reader: R)需要.zip来实施Read(由Response完成ZipArchive)和SeekR未实现。

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

reqwest

由于File同时实现了Responsecopy_to(&mut tmpfile) ,因此可以使用zip

Seek

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

Read

tempfile是一个方便的箱子,可以让你创建一个临时文件,所以你不必考虑名字。

答案 1 :(得分:1)

我是如何从位于其上的档案 hello.zip 中读取内容为hello world的文件 hello.txt 的。本地服务器:

extern crate reqwest;
extern crate zip;

use std::io::Read;

fn main() {
    let mut res = reqwest::get("http://localhost:8000/hello.zip").unwrap();

    let mut buf: Vec<u8> = Vec::new();
    let _ = res.read_to_end(&mut buf);

    let reader = std::io::Cursor::new(buf);
    let mut zip = zip::ZipArchive::new(reader).unwrap();

    let mut file_zip = zip.by_name("hello.txt").unwrap();
    let mut file_buf: Vec<u8> = Vec::new();
    let _ = file_zip.read_to_end(&mut file_buf);

    let content = String::from_utf8(file_buf).unwrap();

    println!("{}", content);
}

这将输出hello world