rust - 从流“FramedRead”如何在每个块中“做某事”
问题描述
我想使用 crate 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但是如何以一种我可以使用它来调用自定义函数的方式对其进行迭代,或者还计算在外壳中发送的字节数,例如,到目前为止我可以显示“发送的字节数”。
解决方案
例如,您可以使用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);
推荐阅读
- linux - Linux bjobs+bj1 -l:在单个 linux 命令中列出列出的每个作业的日志
- c# - 如何使用 TSS.net 从 TPM 导出公钥?
- sass - 使用带有 lit-element / web-components 的引导模式
- javascript - 基于名称的复选框选择正在提示其他复选框选项
- linux - 无法将 C++ 扩展上传到 Colab
- laravel - 如何根据key获取数据数组?
- unity3d - 有没有更好的方法来写这个自上而下的汽车 mdoel
- ruby - 在Ruby中将字符串解析为时间(Time.parse)时如何忽略DST
- javascript - Javascript - 使用 javascript 将标签与输入相关联
- ios - 为 indexPath 获取 didSelectItemAt 上的值并将其添加到委托/协议以填充标题单元格