perf(backend): replace buffered upload/download with opendal Writer/Reader streams

This commit is contained in:
2026-05-28 20:37:18 +03:00
parent 24b1344d06
commit 70f839698a
4 changed files with 103 additions and 40 deletions

View File

@@ -1,9 +1,11 @@
use axum::{
Json, Router,
body::Body,
extract::{Multipart, Path, State},
response::IntoResponse,
routing::get,
};
use sqlx::types::uuid;
use tracing::info;
use crate::{
@@ -26,23 +28,25 @@ async fn upload_file(
info!("handler: upload_file");
let mut file_name = None;
let mut file_type: Option<String> = None;
let mut bytes = None;
let mut file_storage_key = None;
let mut file_size = None;
while let Some(field) = multipart.next_field().await.unwrap() {
match field.name().unwrap() {
// "file_type" => file_type = Some(field.text().await.unwrap().parse().unwrap()),
"file" => {
file_name = field.file_name().map(|s| s.to_string());
bytes = Some(field.bytes().await.unwrap().to_vec())
}
_ => (),
if field.name().unwrap() == "file" {
let name = field.file_name().map(|s| s.to_string()).unwrap_or_default();
let key = format!("{}-{}", name, uuid::Uuid::new_v4());
let size = file_repository.upload_file(field, &key).await?;
file_name = Some(name);
file_storage_key = Some(key);
file_size = Some(size);
}
}
if let (Some(bytes), Some(file_name)) = (bytes, file_name) {
let file = file_repository.upload_file(bytes, file_name).await?;
return Ok(Json(file));
if let (Some(name), Some(key), Some(size)) = (file_name, file_storage_key, file_size) {
let file_record = file_repository
.create_file_record(&name, size, &key)
.await?;
return Ok(Json(file_record));
}
Err(LoftError::UndefinedErrorType)
@@ -62,8 +66,8 @@ async fn download_file(
State(file_repository): State<FileRepository>,
Path(file_id): Path<u64>,
) -> Result<impl IntoResponse, LoftError> {
let bytes = file_repository.download_file(file_id as i64).await?;
Ok(bytes)
let stream = file_repository.download_file(file_id as i64).await?;
Ok(Body::from_stream(stream))
}
async fn delete_file(