【问题标题】:How to write incoming stream into a file in warp?如何将传入流写入warp中的文件?
【发布时间】:2021-02-07 10:26:30
【问题描述】:

目标:

服务器应该能够接收二进制数据流并将其保存到文件中。

我收到此错误:

mismatched types

expected `&[u8]`, found type parameter `B`

如何从泛型类型B 中获取&[u8]

use warp::Filter;
use warp::{body};
use futures::stream::Stream;

async fn handle_upload<S, B>(stream: S) -> Result<impl warp::Reply, warp::Rejection>
where
    S: Stream<Item = Result<B, warp::Error>>,
    S: StreamExt,
    B: warp::Buf
{
    let mut file = File::create("some_binary_file").unwrap();
    
    let pinnedStream = Box::pin(stream);
    while let Some(item) = pinnedStream.next().await {
        let data = item.unwrap();
        file.write_all(data);
    }
    Ok(warp::reply())
}

#[tokio::main]
async fn main() {
    pretty_env_logger::init();

    let upload = warp::put()
    .and(warp::path("stream"))
    .and(body::stream())
    .and_then(handle_upload);
    
    warp::serve(upload).run(([127, 0, 0, 1], 3030)).await;
}

【问题讨论】:

    标签: rust rust-tokio rust-warp


    【解决方案1】:

    B 实现了从bytes crate 重新导出的warp::Buf。它有一个.bytes() 方法,该方法返回一个可能有效的&amp;[u8]

    但是,文档说.bytes() 可能会返回比它实际包含的更短的切片。所以你可以在流.has_remaining() 时调用.bytes().advance() 或将其转换为Bytes 并将其发送到文件:

    let mut data = item.unwrap();
    file.write_all(data.to_bytes().as_ref());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 2012-03-23
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2015-07-10
      • 1970-01-01
      相关资源
      最近更新 更多