Как записать входящий поток в файл в warp?

#rust #rust-tokio #rust-warp

#Ржавчина #rust-tokio #rust-деформация

Вопрос:

Цель:

Сервер должен иметь возможность получать поток двоичных данных и сохранять его в файл.

Я получаю эту ошибку:

 mismatched types

expected `amp;[u8]`, found type parameter `B`
  

Как я могу получить amp;[u8] из универсального типа B ?

 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;
}
  

Ответ №1:

B реализует warp::Buf , который повторно экспортируется из ящика байтов. У него есть .bytes() метод, который возвращает a amp;[u8] , который может работать.

Однако в документации говорится .bytes() , что это может возвращать более короткий фрагмент, чем тот, который он фактически содержит. Таким образом, вы можете вызывать .bytes() и .advance() поток во время него .has_remaining() ИЛИ конвертировать его Bytes и отправлять в файл:

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