diff --git a/src/main.rs b/src/main.rs index 49e57e5..fbf0d7d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ use axum::{ response::Html, routing::{get, post}, }; -use tokio::{net::TcpListener, time::Instant}; +use tokio::{io::AsyncWriteExt, net::TcpListener, time::Instant}; #[tokio::main] async fn main() -> Result<()> { @@ -25,25 +25,41 @@ async fn main() -> Result<()> { async fn upload(mut multipart: Multipart) -> Result, StatusCode> { let now = Instant::now(); - let field = multipart + println!("Starting upload"); + + let mut field = multipart .next_field() .await .map_err(|_| StatusCode::BAD_REQUEST)? .ok_or(StatusCode::BAD_REQUEST)?; + println!("Got field"); + let file_name = field.file_name().ok_or(StatusCode::BAD_REQUEST)?.to_owned(); - let bytes = field.bytes().await.map_err(|e| { - dbg!(e); - StatusCode::BAD_REQUEST - })?; + println!("Got file name: {file_name}"); - tokio::fs::write(format!("./uploads/{file_name}"), bytes) + let mut file = tokio::fs::OpenOptions::new() + .truncate(true) + .write(true) + .create(true) + .create_new(true) + .open(format!("./uploads/{file_name}")) .await - .map_err(|_| StatusCode::BAD_REQUEST)?; + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + + println!("Writing to file"); + + while let Ok(Some(chunk)) = field.chunk().await { + file.write(&chunk) + .await + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + } let elapsed = now.elapsed(); + println!("Finished writing to file: {elapsed:?}"); + Ok(Html( UploadedTemplate { time: &format!("{elapsed:?}"),