- 增加文件大小限制和流式写入

This commit is contained in:
Pine
2026-05-13 02:47:03 +08:00
parent 1f3bd690f0
commit 68ddb6446b
5 changed files with 26 additions and 15 deletions
BIN
View File
Binary file not shown.
+1 -6
View File
@@ -1,6 +1 @@
<svg width="206" height="231" viewBox="0 0 206 231" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M143.143 84C143.143 96.1503 133.293 106 121.143 106C108.992 106 99.1426 96.1503 99.1426 84C99.1426 71.8497 108.992 62 121.143 62C133.293 62 143.143 71.8497 143.143 84Z" fill="#FFC131"/>
<ellipse cx="84.1426" cy="147" rx="22" ry="22" transform="rotate(180 84.1426 147)" fill="#24C8DB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M166.738 154.548C157.86 160.286 148.023 164.269 137.757 166.341C139.858 160.282 141 153.774 141 147C141 144.543 140.85 142.121 140.558 139.743C144.975 138.204 149.215 136.139 153.183 133.575C162.73 127.404 170.292 118.608 174.961 108.244C179.63 97.8797 181.207 86.3876 179.502 75.1487C177.798 63.9098 172.884 53.4021 165.352 44.8883C157.82 36.3744 147.99 30.2165 137.042 27.1546C126.095 24.0926 114.496 24.2568 103.64 27.6274C92.7839 30.998 83.1319 37.4317 75.8437 46.1553C74.9102 47.2727 74.0206 48.4216 73.176 49.5993C61.9292 50.8488 51.0363 54.0318 40.9629 58.9556C44.2417 48.4586 49.5653 38.6591 56.679 30.1442C67.0505 17.7298 80.7861 8.57426 96.2354 3.77762C111.685 -1.01901 128.19 -1.25267 143.769 3.10474C159.348 7.46215 173.337 16.2252 184.056 28.3411C194.775 40.457 201.767 55.4101 204.193 71.404C206.619 87.3978 204.374 103.752 197.73 118.501C191.086 133.25 180.324 145.767 166.738 154.548ZM41.9631 74.275L62.5557 76.8042C63.0459 72.813 63.9401 68.9018 65.2138 65.1274C57.0465 67.0016 49.2088 70.087 41.9631 74.275Z" fill="#FFC131"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M38.4045 76.4519C47.3493 70.6709 57.2677 66.6712 67.6171 64.6132C65.2774 70.9669 64 77.8343 64 85.0001C64 87.1434 64.1143 89.26 64.3371 91.3442C60.0093 92.8732 55.8533 94.9092 51.9599 97.4256C42.4128 103.596 34.8505 112.392 30.1816 122.756C25.5126 133.12 23.9357 144.612 25.6403 155.851C27.3449 167.09 32.2584 177.598 39.7906 186.112C47.3227 194.626 57.153 200.784 68.1003 203.846C79.0476 206.907 90.6462 206.743 101.502 203.373C112.359 200.002 122.011 193.568 129.299 184.845C130.237 183.722 131.131 182.567 131.979 181.383C143.235 180.114 154.132 176.91 164.205 171.962C160.929 182.49 155.596 192.319 148.464 200.856C138.092 213.27 124.357 222.426 108.907 227.222C93.458 232.019 76.9524 232.253 61.3736 227.895C45.7948 223.538 31.8055 214.775 21.0867 202.659C10.3679 190.543 3.37557 175.59 0.949823 159.596C-1.47592 143.602 0.768139 127.248 7.41237 112.499C14.0566 97.7497 24.8183 85.2327 38.4045 76.4519ZM163.062 156.711L163.062 156.711C162.954 156.773 162.846 156.835 162.738 156.897C162.846 156.835 162.954 156.773 163.062 156.711Z" fill="#24C8DB"/>
</svg>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1778610945349" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1137" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M866.2528 385.9968m0 115.0464l0 275.8144q0 115.0464-115.0464 115.0464l-260.2496 0q-115.0464 0-115.0464-115.0464l0-275.8144q0-115.0464 115.0464-115.0464l260.2496 0q115.0464 0 115.0464 115.0464Z" fill="#CFF6FF" p-id="1138"></path><path d="M556.544 912.128H258.7648c-62.8224 0-113.9712-58.0608-113.9712-129.3312v-185.1904a25.6 25.6 0 0 1 51.2 0v185.1904c0 43.0592 28.16 78.1312 62.7712 78.1312h297.7792a25.6 25.6 0 1 1 0 51.2zM778.6496 537.6c-53.9648 0-103.4752-23.4496-133.7856-60.5184C614.4 514.048 564.992 537.6 511.0784 537.6s-103.4752-23.552-133.7856-60.6208C346.9824 514.048 297.4208 537.6 243.5072 537.6a175.7696 175.7696 0 0 1-115.2512-41.472c-43.1616-37.1712-56.32-93.9008-32.9728-144.384l92.5696-201.984c12.288-26.88 40.96-44.2368 73.3696-44.2368H781.824c34.3552 0 64.6144 19.712 75.4176 49.0496l75.1616 204.8a119.7056 119.7056 0 0 1-20.0192 117.8112c-30.8224 37.7344-80.7936 60.416-133.7344 60.416zM645.12 399.36a25.6 25.6 0 0 1 24.32 17.664c13.2608 40.96 58.2656 69.3248 109.4656 69.3248 37.6832 0 72.9088-15.36 94.0544-41.472a68.1472 68.1472 0 0 0 11.6224-68.0448L808.96 172.2368c-3.2768-8.96-14.7968-15.36-27.3408-15.36H261.12c-11.9296 0-22.9888 5.888-26.8288 14.336L141.8752 373.0432a70.7072 70.7072 0 0 0 19.8144 84.3264 124.8256 124.8256 0 0 0 81.92 28.928c51.2 0 96.1536-28.5184 109.4144-69.3248a25.6 25.6 0 0 1 48.6912 0C414.72 457.7792 459.8784 486.4 511.0784 486.4s96.1536-28.5184 109.4144-69.3248A25.6 25.6 0 0 1 645.12 399.36zM118.5792 362.3936z" fill="#474747" p-id="1139"></path><path d="M728.6272 347.136H296.3456a25.6 25.6 0 0 1 0-51.2h432.2816a25.6 25.6 0 0 1 0 51.2z" fill="#474747" p-id="1140"></path><path d="M802.6624 917.504h-88.7296a90.112 90.112 0 0 1-77.824-44.9536l-44.3392-76.8a90.0608 90.0608 0 0 1 0-89.9072l44.3392-76.8a90.1632 90.1632 0 0 1 77.824-44.9024h88.7296a90.0096 90.0096 0 0 1 77.824 44.9536l44.3904 76.8a90.3168 90.3168 0 0 1 0 89.9072l-44.3904 76.8a90.0096 90.0096 0 0 1-77.824 44.9024z m-88.7296-282.2144a38.7584 38.7584 0 0 0-33.4848 19.3024l-44.3392 76.8a38.7072 38.7072 0 0 0 0 38.7072l44.3392 76.8a38.8096 38.8096 0 0 0 33.4848 19.3536h88.7296a38.7584 38.7584 0 0 0 33.4848-19.3536l44.3904-76.8a38.9632 38.9632 0 0 0 0-38.7072l-44.3904-76.8a38.7072 38.7072 0 0 0-33.4848-19.3024z" fill="#1285EF" p-id="1141"></path><path d="M758.3232 823.1424a72.3968 72.3968 0 1 1 72.3456-72.3456 72.448 72.448 0 0 1-72.3456 72.3456z m0-93.5424a21.1968 21.1968 0 1 0 21.1456 21.1968 21.248 21.248 0 0 0-21.1456-21.1968z" fill="#1285EF" p-id="1142"></path></svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1778610945349" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1137" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M866.2528 385.9968m0 115.0464l0 275.8144q0 115.0464-115.0464 115.0464l-260.2496 0q-115.0464 0-115.0464-115.0464l0-275.8144q0-115.0464 115.0464-115.0464l260.2496 0q115.0464 0 115.0464 115.0464Z" fill="#CFF6FF" p-id="1138"></path><path d="M556.544 912.128H258.7648c-62.8224 0-113.9712-58.0608-113.9712-129.3312v-185.1904a25.6 25.6 0 0 1 51.2 0v185.1904c0 43.0592 28.16 78.1312 62.7712 78.1312h297.7792a25.6 25.6 0 1 1 0 51.2zM778.6496 537.6c-53.9648 0-103.4752-23.4496-133.7856-60.5184C614.4 514.048 564.992 537.6 511.0784 537.6s-103.4752-23.552-133.7856-60.6208C346.9824 514.048 297.4208 537.6 243.5072 537.6a175.7696 175.7696 0 0 1-115.2512-41.472c-43.1616-37.1712-56.32-93.9008-32.9728-144.384l92.5696-201.984c12.288-26.88 40.96-44.2368 73.3696-44.2368H781.824c34.3552 0 64.6144 19.712 75.4176 49.0496l75.1616 204.8a119.7056 119.7056 0 0 1-20.0192 117.8112c-30.8224 37.7344-80.7936 60.416-133.7344 60.416zM645.12 399.36a25.6 25.6 0 0 1 24.32 17.664c13.2608 40.96 58.2656 69.3248 109.4656 69.3248 37.6832 0 72.9088-15.36 94.0544-41.472a68.1472 68.1472 0 0 0 11.6224-68.0448L808.96 172.2368c-3.2768-8.96-14.7968-15.36-27.3408-15.36H261.12c-11.9296 0-22.9888 5.888-26.8288 14.336L141.8752 373.0432a70.7072 70.7072 0 0 0 19.8144 84.3264 124.8256 124.8256 0 0 0 81.92 28.928c51.2 0 96.1536-28.5184 109.4144-69.3248a25.6 25.6 0 0 1 48.6912 0C414.72 457.7792 459.8784 486.4 511.0784 486.4s96.1536-28.5184 109.4144-69.3248A25.6 25.6 0 0 1 645.12 399.36zM118.5792 362.3936z" fill="#474747" p-id="1139"></path><path d="M728.6272 347.136H296.3456a25.6 25.6 0 0 1 0-51.2h432.2816a25.6 25.6 0 0 1 0 51.2z" fill="#474747" p-id="1140"></path><path d="M802.6624 917.504h-88.7296a90.112 90.112 0 0 1-77.824-44.9536l-44.3392-76.8a90.0608 90.0608 0 0 1 0-89.9072l44.3392-76.8a90.1632 90.1632 0 0 1 77.824-44.9024h88.7296a90.0096 90.0096 0 0 1 77.824 44.9536l44.3904 76.8a90.3168 90.3168 0 0 1 0 89.9072l-44.3904 76.8a90.0096 90.0096 0 0 1-77.824 44.9024z m-88.7296-282.2144a38.7584 38.7584 0 0 0-33.4848 19.3024l-44.3392 76.8a38.7072 38.7072 0 0 0 0 38.7072l44.3392 76.8a38.8096 38.8096 0 0 0 33.4848 19.3536h88.7296a38.7584 38.7584 0 0 0 33.4848-19.3536l44.3904-76.8a38.9632 38.9632 0 0 0 0-38.7072l-44.3904-76.8a38.7072 38.7072 0 0 0-33.4848-19.3024z" fill="#1285EF" p-id="1141"></path><path d="M758.3232 823.1424a72.3968 72.3968 0 1 1 72.3456-72.3456 72.448 72.448 0 0 1-72.3456 72.3456z m0-93.5424a21.1968 21.1968 0 1 0 21.1456 21.1968 21.248 21.248 0 0 0-21.1456-21.1968z" fill="#1285EF" p-id="1142"></path></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

+23 -7
View File
@@ -3,7 +3,7 @@ use crate::models::*;
use crate::storage::{get_media_type, is_allowed_extension, STORAGE};
use axum::{
body::Body,
extract::{Form, Multipart, State},
extract::{DefaultBodyLimit, Form, Multipart, State},
http::{Response, StatusCode, Uri},
response::sse::{Event, KeepAlive, Sse},
response::Json,
@@ -17,6 +17,7 @@ use std::convert::Infallible;
use std::path::PathBuf;
use std::sync::Arc;
use std::fs;
use tokio::io::AsyncWriteExt;
use tokio_stream::wrappers::BroadcastStream;
use tokio_stream::StreamExt;
use tower_http::cors::CorsLayer;
@@ -181,6 +182,7 @@ pub fn create_router(state: AppState) -> Router {
.nest_service("/file", ServeDir::new(media_dir_str()))
// SPA 回退 → 嵌入式文件(跨平台,编译到二进制中)
.fallback_service(get(spa_fallback))
.layer(DefaultBodyLimit::max(2048 * 1024 * 1024)) // 2GB 上传限制
.layer(CorsLayer::permissive())
.with_state(state)
}
@@ -290,7 +292,7 @@ async fn list_media() -> Json<FilesResponse> {
async fn upload_handler(
mut multipart: Multipart,
) -> Result<Json<serde_json::Value>, (StatusCode, String)> {
while let Ok(Some(field)) = multipart.next_field().await {
while let Ok(Some(mut field)) = multipart.next_field().await {
let file_name = field.file_name().unwrap_or("file").to_string();
let ext = std::path::Path::new(&file_name)
.extension()
@@ -310,12 +312,26 @@ async fn upload_handler(
let new_name = format!("{}_{}{}", stem, ts, ext);
let save_path = media_dir().join(&new_name);
let data = field.bytes().await.map_err(|e| {
(StatusCode::INTERNAL_SERVER_ERROR, e.to_string())
})?;
fs::write(&save_path, &data).map_err(|e| {
(StatusCode::INTERNAL_SERVER_ERROR, e.to_string())
// 流式写入文件,避免大视频文件占用过多内存
let mut file = tokio::fs::File::create(&save_path).await.map_err(|e| {
(StatusCode::INTERNAL_SERVER_ERROR, format!("文件创建失败: {}", e))
})?;
loop {
match field.chunk().await {
Ok(Some(chunk)) => {
file.write_all(&chunk).await.map_err(|e| {
(StatusCode::INTERNAL_SERVER_ERROR, format!("写入文件失败: {}", e))
})?;
}
Ok(None) => break,
Err(e) => {
return Err((
StatusCode::INTERNAL_SERVER_ERROR,
format!("读取上传数据失败: {}", e),
))
}
}
}
}
Ok(Json(serde_json::json!({"ok": true})))
}
+1 -1
View File
@@ -276,7 +276,7 @@
/* ============ Sound Hint ============ */
#soundHint {
position: fixed;
bottom: 48px;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
z-index: 100;