我需要下载一个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'))
}
})
})
答案 0 :(得分:4)
使用reqwest
,您可以获得.zip
文件:
reqwest::get("myfile.zip")
由于reqwest
只能用于检索文件,因此ZipArchive
包中的zip
可用于解包。由于ZipArchive::new(reader: R)
需要.zip
来实施Read
(由Response
完成ZipArchive
)和Seek
,R
未实现。
作为一种解决方法,您可以使用临时文件:
reqwest
由于File
同时实现了Response
和copy_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