#stream #async-stream #future #async #futures-util

streamer

Streamer 是一个处理流的便捷工具

3 个版本

0.1.2 2022 年 6 月 27 日
0.1.1 2022 年 6 月 27 日
0.1.0 2022 年 6 月 22 日

#42 in #async-stream

Download history 142/week @ 2024-03-14 110/week @ 2024-03-21 135/week @ 2024-03-28 142/week @ 2024-04-04 130/week @ 2024-04-11 139/week @ 2024-04-18 162/week @ 2024-04-25 114/week @ 2024-05-02 107/week @ 2024-05-09 130/week @ 2024-05-16 139/week @ 2024-05-23 139/week @ 2024-05-30 129/week @ 2024-06-06 55/week @ 2024-06-13

每月下载量 208

MIT 许可证

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