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,