问题描述
我想使用板条箱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);