我正在try 将用reqwest下载的文件复制到Tokio文件中.此文件太大,无法存储在内存中,因此它需要存储到bytes_stream(),而不是bytes()

我曾try 过以下几种方法

let mut tmp_file = tokio::fs::File::from(tempfile::tempfile()?);
let byte_stream = reqwest::get(&link).await?.bytes_stream();
tokio::io::copy(&mut byte_stream, &mut tmp_file).await?;

此操作失败的原因是

    |
153 |     tokio::io::copy(&mut byte_stream, &mut tmp_file).await?;
    |     --------------- ^^^^^^^^^^^^^^^^ the trait `tokio::io::AsyncRead` is not implemented for `impl Stream<Item = Result<bytes::bytes::Bytes, reqwest::Error>>`
    |     |
    |     required by a bound introduced by this call

有没有办法让特征AsyncRead on the Stream或者以其他方式将该数据复制到文件中?我之所以使用Tokio文件,是因为我稍后需要从它进行AsyncRead.也许将其复制到常规的std::文件,然后将其转换为Tokio::FS::文件是有意义的?

推荐答案

这种方法奏效了.松散地基于bytes_stream()的示例

注意:你可能想要buffer the writes here

use futures::StreamExt;

let mut tmp_file = tokio::fs::File::from(tempfile::tempfile()?);
let mut byte_stream = reqwest::get(&link).await?.bytes_stream();

while let Some(item) = byte_stream.next().await {
  tokio::io::copy(&mut item?.as_ref(), &mut tmp_file).await?;
}

Rust相关问答推荐

PyReadonlyArray2到Vec T<>

如何使用syn插入 comments ?

当第二个`let`依赖于第一个`let()`时,如何在一行中有多个`let()`?

在使用#[NO_STD]时,如何在Rust中收到紧急消息?

Trait bound i8:来自u8的不满意

如何将单个 struct 实例与插入器一起传递到Rust中的映射

类型生命周期绑定的目的是什么?

仅发布工作区的二进制 crate

根据掩码将 simd 通道设置为 0 的惯用方法?

返回优化后的标题:返回异步块的闭包的类型擦除

Rust中的位移操作对范围有什么影响?

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

使用 lalrpop 在 rust 中解析由 " 引用的字符串

Rust:`sort_by` 多个条件,冗长的模式匹配

当特征函数依赖于为 Self 实现的通用标记特征时实现通用包装器

如何将 u8 切片复制到 u32 切片中?

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

在 Rust 中组合特征的不同方法是否等效?

如何在 Rust 中使用特征标志来捕获多行代码?