From 29d2d49d258046534548b91c30ffb49a4f0c0ba1 Mon Sep 17 00:00:00 2001 From: matevip Date: Sat, 2 May 2026 23:11:40 +0800 Subject: [PATCH] fix(wiki): widen mime_type to VARCHAR(255) so Office uploads don't blow the column --- .../wiki/service/WikiRawMaterialService.java | 19 ++++++++++++++++++- .../h2/V84__widen_raw_material_mime_type.sql | 7 +++++++ .../V84__widen_raw_material_mime_type.sql | 7 +++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 mateclaw-server/src/main/resources/db/migration/h2/V84__widen_raw_material_mime_type.sql create mode 100644 mateclaw-server/src/main/resources/db/migration/mysql/V84__widen_raw_material_mime_type.sql diff --git a/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiRawMaterialService.java b/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiRawMaterialService.java index f9446c52..cac3b026 100644 --- a/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiRawMaterialService.java +++ b/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiRawMaterialService.java @@ -154,7 +154,7 @@ public class WikiRawMaterialService { entity.setKbId(kbId); entity.setTitle(title); entity.setSourceType(sourceType); - entity.setMimeType(mimeType); + entity.setMimeType(capMimeType(mimeType)); entity.setSourcePath(sourcePath); entity.setFileSize(fileSize); entity.setProcessingStatus("pending"); @@ -195,6 +195,23 @@ public class WikiRawMaterialService { return entity; } + /** + * Defensive cap on the persisted Content-Type so a long upload header + * never blocks the insert. The column itself is wide (V84 → VARCHAR(255)) + * but capping at the service layer keeps the schema and the writer in + * lockstep — we'd rather drop the rare overlong header (chrome-derived + * Content-Type with charset / boundary parameters) than fail the upload. + */ + private static final int MIME_TYPE_MAX_CHARS = 255; + + private static String capMimeType(String mimeType) { + if (mimeType == null) return null; + if (mimeType.length() <= MIME_TYPE_MAX_CHARS) return mimeType; + log.warn("[Wiki] Truncating Content-Type ({} chars) to fit storage column: {}", + mimeType.length(), mimeType.substring(0, 60) + "…"); + return mimeType.substring(0, MIME_TYPE_MAX_CHARS); + } + /** * CAS 式抢占:仅当当前状态为 pending 时才更新为 processing。 * diff --git a/mateclaw-server/src/main/resources/db/migration/h2/V84__widen_raw_material_mime_type.sql b/mateclaw-server/src/main/resources/db/migration/h2/V84__widen_raw_material_mime_type.sql new file mode 100644 index 00000000..1940bfeb --- /dev/null +++ b/mateclaw-server/src/main/resources/db/migration/h2/V84__widen_raw_material_mime_type.sql @@ -0,0 +1,7 @@ +-- V80 created mate_wiki_raw_material.mime_type as VARCHAR(64). Office Open +-- XML Content-Types blow that on the very first upload — docx is 71 chars, +-- pptx is 73, xlsx is 65 — so any user uploading a Word / Excel / PowerPoint +-- file hits "Data truncation: Data too long for column 'mime_type'". +-- Widen to 255 (covers any registered RFC 6838 type with parameters). + +ALTER TABLE mate_wiki_raw_material ALTER COLUMN mime_type SET DATA TYPE VARCHAR(255); diff --git a/mateclaw-server/src/main/resources/db/migration/mysql/V84__widen_raw_material_mime_type.sql b/mateclaw-server/src/main/resources/db/migration/mysql/V84__widen_raw_material_mime_type.sql new file mode 100644 index 00000000..80973285 --- /dev/null +++ b/mateclaw-server/src/main/resources/db/migration/mysql/V84__widen_raw_material_mime_type.sql @@ -0,0 +1,7 @@ +-- V80 created mate_wiki_raw_material.mime_type as VARCHAR(64). Office Open +-- XML Content-Types blow that on the very first upload — docx is 71 chars, +-- pptx is 73, xlsx is 65 — so any user uploading a Word / Excel / PowerPoint +-- file hits "Data truncation: Data too long for column 'mime_type'". +-- Widen to 255 (covers any registered RFC 6838 type with parameters). + +ALTER TABLE mate_wiki_raw_material MODIFY COLUMN mime_type VARCHAR(255);