upload in chunks
This commit is contained in:
32
src/main.rs
32
src/main.rs
@@ -7,7 +7,7 @@ use axum::{
|
|||||||
response::Html,
|
response::Html,
|
||||||
routing::{get, post},
|
routing::{get, post},
|
||||||
};
|
};
|
||||||
use tokio::{net::TcpListener, time::Instant};
|
use tokio::{io::AsyncWriteExt, net::TcpListener, time::Instant};
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
@@ -25,25 +25,41 @@ async fn main() -> Result<()> {
|
|||||||
async fn upload(mut multipart: Multipart) -> Result<Html<String>, StatusCode> {
|
async fn upload(mut multipart: Multipart) -> Result<Html<String>, StatusCode> {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
|
|
||||||
let field = multipart
|
println!("Starting upload");
|
||||||
|
|
||||||
|
let mut field = multipart
|
||||||
.next_field()
|
.next_field()
|
||||||
.await
|
.await
|
||||||
.map_err(|_| StatusCode::BAD_REQUEST)?
|
.map_err(|_| StatusCode::BAD_REQUEST)?
|
||||||
.ok_or(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 file_name = field.file_name().ok_or(StatusCode::BAD_REQUEST)?.to_owned();
|
||||||
|
|
||||||
let bytes = field.bytes().await.map_err(|e| {
|
println!("Got file name: {file_name}");
|
||||||
dbg!(e);
|
|
||||||
StatusCode::BAD_REQUEST
|
|
||||||
})?;
|
|
||||||
|
|
||||||
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
|
.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();
|
let elapsed = now.elapsed();
|
||||||
|
|
||||||
|
println!("Finished writing to file: {elapsed:?}");
|
||||||
|
|
||||||
Ok(Html(
|
Ok(Html(
|
||||||
UploadedTemplate {
|
UploadedTemplate {
|
||||||
time: &format!("{elapsed:?}"),
|
time: &format!("{elapsed:?}"),
|
||||||
|
|||||||
Reference in New Issue
Block a user