From 0119a329aa42675c42d903257250aed03733475b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 7 Oct 2026 14:26:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=AA=92=E4=BD=93=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=A0=87=E6=B3=A8=E6=95=B4=E4=BD=93=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E7=9A=84=E6=80=A7=E8=83=BD=E9=9A=90=E6=82=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - game_distribution_media.rs 在 Field::bytes() 处补 TODO(perf),说明峰值约 2× part 与 field.chunk() 流式限长改法 --- .../crates/api-server/src/modules/game_distribution_media.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server-rs/crates/api-server/src/modules/game_distribution_media.rs b/server-rs/crates/api-server/src/modules/game_distribution_media.rs index 2ed0207ad..756adf81a 100644 --- a/server-rs/crates/api-server/src/modules/game_distribution_media.rs +++ b/server-rs/crates/api-server/src/modules/game_distribution_media.rs @@ -175,6 +175,10 @@ async fn read_image_field( kind: MediaKind, ) -> Result { let label = kind.label(); + // TODO(perf): `Field::bytes()` 会把整个 part 收成一个 `Bytes`,下面 `to_vec()` 再复制一份, + // 峰值内存约 2× part;单个超大 part 会被完整缓冲后才在下面判 413。彻底做法是改 + // `field.chunk()` 循环累加,边收边按 `MAX_SINGLE_MEDIA_BYTES` 拒绝,并让 `UploadedImage.bytes` + // 直接持有 `Vec`。当前保留现状,先在此标注。 let bytes = field .bytes() .await