upload in chunks

This commit is contained in:
2025-10-01 13:44:23 +02:00
parent 04e89c10a0
commit 5dc06b24e6

View File

@@ -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<Html<String>, 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:?}"),