upload in chunks
This commit is contained in:
32
src/main.rs
32
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<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:?}"),
|
||||
|
||||
Reference in New Issue
Block a user