From 79ae24fa433beed5a6effb8e345c80b605a839a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 17:43:52 +0800 Subject: [PATCH] =?UTF-8?q?3D=20=E4=BA=A7=E7=89=A9=E7=9A=84=20content=20ty?= =?UTF-8?q?pe=20=E4=B8=8E=E8=90=BD=E5=BA=93=E5=80=BC=E5=90=8C=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server-rs/crates/api-server/src/tripo3d/storage.rs:返回给调用方的 content_type 改为优先取 HEAD 复核回来的值(取不到才回落到本地解析值),与 asset_object.content_type 用同一份取值。此前接口返回的是本地解析值、落库的是 OSS 回显值,OSS 一旦归一化或回显空值,两个来源就会给出互相矛盾的元数据 --- server-rs/crates/api-server/src/tripo3d/storage.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server-rs/crates/api-server/src/tripo3d/storage.rs b/server-rs/crates/api-server/src/tripo3d/storage.rs index 98393d8a4..efafde061 100644 --- a/server-rs/crates/api-server/src/tripo3d/storage.rs +++ b/server-rs/crates/api-server/src/tripo3d/storage.rs @@ -156,6 +156,12 @@ pub(crate) async fn store_model3d_artifact( ) .await .map_err(|error| map_oss_error(error, "aliyun-oss"))?; + // HEAD 复核回来的 Content-Type 才是落库与对外共用的那份:只把本地解析值给调用方, + // 会出现「接口返回的 content type」与「asset_object.content_type」不一致。 + let effective_content_type = head + .content_type + .clone() + .unwrap_or_else(|| content_type.clone()); let now_micros = current_utc_micros(); // asset_object 的 ID 必须是 (owner, operation_kind, operation_id, slot) 的稳定派生值, // 否则 SpacetimeDB 侧会以“生成结果 asset object ID 不是 operation 稳定 ID”拒绝整笔提交。 @@ -169,7 +175,7 @@ pub(crate) async fn store_model3d_artifact( head.bucket, head.object_key.clone(), AssetObjectAccessPolicy::Private, - head.content_type.or(Some(content_type.clone())), + Some(effective_content_type.clone()), head.content_length, Some(sha256.clone()), MODEL3D_ASSET_KIND.to_string(), @@ -182,7 +188,7 @@ pub(crate) async fn store_model3d_artifact( .map_err(map_editor_asset_field_error)?; Ok(StoredModel3dArtifact { object_key: head.object_key, - content_type, + content_type: effective_content_type, content_length: head.content_length, sha256, asset_object,