perf(backend): replace buffered upload/download with opendal Writer/Reader streams
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user