#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());