3 个版本
0.1.2 | 2022 年 6 月 27 日 |
---|---|
0.1.1 | 2022 年 6 月 27 日 |
0.1.0 | 2022 年 6 月 22 日 |
#42 in #async-stream
每月下载量 208
21KB
365 行
简介
Streamer 是一个处理流的便捷工具,它提供了一套结构体和特质以处理流
文件
字符串
&'static 字符串
Vec<T>
[T;N]
Box<[T]>
快速入门
一些示例来指导您
echo "1234567890abcdefghijklmnopqrstuvw" >> info
use streamer::{Stream, StreamExt, Streaming};
async fn run() {
let file = File::open("info").unwrap();
let streaming = Streaming::from(file);
streaming
.chunks(5)
.take(3)
.for_each(|en| async move {
println!("stream 5 bytes as a chunk: {:?}", std::str::from_utf8(&en).unwrap());
})
.await;
}
输出结果
stream 5 bytes as a chunk: 12345
stream 5 bytes as a chunk: 67890
stream 5 bytes as a chunk: abcde
async fn run() {
// let s = "1234567890abcdefghijklmnopqrstuvw"; // output the same as above
// let s = "1234567890abcdefghijklmnopqrstuvw".to_string(); // output the same as above
let s: [u8; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
let s = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
let streaming = Streaming::from(s);
streaming
.chunks(4)
.take(3)
.for_each(|en| async move {
println!("{:?}", &en);
})
.await;
}
输出结果
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 0]
Hyper 主体集成
由于我是 hyper 的重度用户,所以发送请求的主体不像其他方法那样方便,特别是对于流式传输图像、视频、文档等。它允许您以 HTTP 格式分块传输大文件
要使用它,启用 hyper
功能
[dependencies]
streamer = { version = "*", features = ["hyper"] }
use hyper::{Body, Request}:
let file = File::open("info").unwrap();
let mut streaming = Streamer::new(file);
streaming.meta.set_buf_len(10); // length sent as a chunk, the default is 64kB
streaming.meta.set_name("doc"); // field name
streaming.meta.set_filename("info"); // file name
let body: Body = streaming.streaming();
// build a request
let request: Request<Body> = Request::post("<uri-here>").body(body).expect("failed to build a request");
它将以 10 字节块发送文件 info
,每个块都格式化为 HTTP multipart/form-data
,这样您就可以分割大文件并以分块的形式传输。
待添加的功能
可能可以进行一些压缩以降低网络流量
- 流式传输分块压缩
依赖关系
~0.5–2.2MB
~39K SLoC