从流“ FramedRead”中如何在每个块中“做某事”

问题描述

我想使用板条箱indicatif显示文件的上传进度,我正在使用reqwest异步上传文件,如下所示:

use tokio::fs::File;
use tokio_util::codec::{BytesCodec,FramedRead};

let file = File::open(file_path).await?;
let stream = FramedRead::new(file,BytesCodec::new());
let body = Body::wrap_stream(stream);
client.put(url).body(body)

进度条的实现方式如下:

use indicatif::ProgressBar;

let bar = ProgressBar::new(1000);
for _ in 0..1000 {
    bar.inc(1);
    // ...
}
bar.finish();

如何从stream

let stream = FramedRead::new(file,BytesCodec::new());
// how on every chunk do X ? 
let body = Body::wrap_stream(stream);

每次互动我都可以打bar.inc(1)吗?

从文档中我看到有一个read_buffer,但是如何遍历它,以便我可以使用它来调用自定义函数,或者在我可以显示“ bytes”的情况下计算发送的字节数到目前为止”。

解决方法

例如,您可以使用TryStreamExt::inspect_ok,当消耗该项目时,它将调用流中每个Ok(item)的引用的闭包。

use futures::stream::TryStreamExt;
use tokio_util::codec::{BytesCodec,FramedRead};

let stream = FramedRead::new(file,BytesCodec::new())
    .inspect_ok(|chunk| {
        // do X with chunk...
    });

let body = Body::wrap_stream(stream);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...