1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
use crate::config::{SAVE_FILE_BASE_PATH, UPLOADS_ENDPOINT};
use crate::errors::AppError;
use axum::{
extract::{Multipart, Path},
http::header::HeaderMap,
};
use std::fs::read;
use rand::random;
/// Upload a file. Returns an `AppError` or the path of the uploaded file
pub async fn upload(
mut multipart: Multipart,
allowed_extensions: Vec<&str>,
) -> Result<String, AppError> {
let mut uploaded_file = String::new();
if let Some(file) = multipart.next_field().await.unwrap() {
let content_type = file.content_type().unwrap().to_string();
let index = content_type.find('/').unwrap_or(usize::max_value());
let mut ext_name = "xxx";
if index != usize::max_value() {
ext_name = &content_type[index + 1..];
}
if allowed_extensions
.iter()
.any(|&x| x.to_lowercase() == ext_name)
{
let rnd = (random::<f32>() * 1000000000 as f32) as i32;
let save_filename = format!("{}/{}.{}", SAVE_FILE_BASE_PATH, rnd, ext_name);
uploaded_file = format!("{}/{}.{}", UPLOADS_ENDPOINT, rnd, ext_name);
let data = file.bytes().await.unwrap();
tokio::fs::write(&save_filename, &data)
.await
.map_err(|err| err.to_string())?;
}
}
if !uploaded_file.is_empty() {
return Ok(uploaded_file);
}
Err(AppError::BadRequest(
"File extension not supported".to_string(),
))
}
/// Axum endpoint which shows uploaded file
pub async fn show_uploads(Path(id): Path<String>) -> (HeaderMap, Vec<u8>) {
// let index = id.find(".").map(|i| i).unwrap_or(usize::max_value());
// let mut ext_name = "xxx";
// if index != usize::max_value() {
// ext_name = &id[index + 1..];
// }
let headers = HeaderMap::new();
let file_name = format!("{}/{}", SAVE_FILE_BASE_PATH, id);
(headers, read(&file_name).unwrap())
}
|