diff --git a/visionA-frontend/src/lib/i18n/dictionaries/en.ts b/visionA-frontend/src/lib/i18n/dictionaries/en.ts index 694f525..8303ec6 100644 --- a/visionA-frontend/src/lib/i18n/dictionaries/en.ts +++ b/visionA-frontend/src/lib/i18n/dictionaries/en.ts @@ -362,7 +362,7 @@ export const en: Dictionary = { "workspace.media.image.primary": "Drag an image here to run inference", "workspace.media.image.hint": "JPG or PNG · up to 20 MB", "workspace.media.video.primary": "Drag a video here to run inference", - "workspace.media.video.hint": "MP4 / AVI / MOV / MPEG · up to 500 MB", + "workspace.media.video.hint": "MP4 / AVI / MOV / MPEG · up to 90 MB", "workspace.media.video.frame": "Frame", "workspace.media.video.seek": "Seek video", "workspace.media.batch.primary": "Drag images here (up to 50) for batch inference", diff --git a/visionA-frontend/src/lib/i18n/dictionaries/zh-Hant.ts b/visionA-frontend/src/lib/i18n/dictionaries/zh-Hant.ts index f7a13c9..b1871fd 100644 --- a/visionA-frontend/src/lib/i18n/dictionaries/zh-Hant.ts +++ b/visionA-frontend/src/lib/i18n/dictionaries/zh-Hant.ts @@ -350,7 +350,7 @@ export const zhHant: Dictionary = { "workspace.media.image.primary": "將圖片拖曳到此處開始推論", "workspace.media.image.hint": "JPG 或 PNG · 上限 20 MB", "workspace.media.video.primary": "將影片拖曳到此處開始推論", - "workspace.media.video.hint": "MP4 / AVI / MOV / MPEG · 上限 500 MB", + "workspace.media.video.hint": "MP4 / AVI / MOV / MPEG · 上限 90 MB", "workspace.media.video.frame": "影格", "workspace.media.video.seek": "影片跳轉", "workspace.media.batch.primary": "將圖片拖曳到此處(最多 50 張)進行批次推論", diff --git a/visionA-frontend/src/lib/media.test.ts b/visionA-frontend/src/lib/media.test.ts index 92639e7..f5c32f8 100644 --- a/visionA-frontend/src/lib/media.test.ts +++ b/visionA-frontend/src/lib/media.test.ts @@ -59,16 +59,16 @@ describe("media validation", () => { expect(validateVideoFile(makeFile("v.jpg"))?.code).toBe("TYPE"); }); - it("影片:上限為 500 MB(常數校驗)", () => { - expect(MAX_VIDEO_BYTES).toBe(500 * 1024 * 1024); + it("影片:上限為 90 MB(常數校驗)", () => { + expect(MAX_VIDEO_BYTES).toBe(90 * 1024 * 1024); }); - it("影片:499 MB 通過,剛好 500 MB 通過,501 MB 擋 SIZE(邊界)", () => { + it("影片:89 MB 通過,剛好 90 MB 通過,91 MB 擋 SIZE(邊界)", () => { const mb = 1024 * 1024; - expect(validateVideoFile(makeSizedFile("v.mp4", 499 * mb))).toBeNull(); + expect(validateVideoFile(makeSizedFile("v.mp4", 89 * mb))).toBeNull(); // 剛好等於上限:validateVideoFile 用 > 判斷,等於上限應通過 - expect(validateVideoFile(makeSizedFile("v.mp4", 500 * mb))).toBeNull(); - expect(validateVideoFile(makeSizedFile("v.mp4", 501 * mb))?.code).toBe("SIZE"); + expect(validateVideoFile(makeSizedFile("v.mp4", 90 * mb))).toBeNull(); + expect(validateVideoFile(makeSizedFile("v.mp4", 91 * mb))?.code).toBe("SIZE"); }); it("批次:空陣列 → EMPTY,超過 50 → COUNT,含非圖 → TYPE", () => { diff --git a/visionA-frontend/src/lib/media.ts b/visionA-frontend/src/lib/media.ts index 9a0906b..9ae4a5a 100644 --- a/visionA-frontend/src/lib/media.ts +++ b/visionA-frontend/src/lib/media.ts @@ -91,7 +91,7 @@ export const VIDEO_ACCEPT = ".mp4,.avi,.mov,.mpeg,.mpg"; /** 前端上傳大小上限(防呆;影片經 tunnel 有 timeout 考量,見評估 R-M2)。 */ export const MAX_IMAGE_BYTES = 20 * 1024 * 1024; // 20 MB -export const MAX_VIDEO_BYTES = 500 * 1024 * 1024; // 500 MB(大檔經 tunnel,caller 端 timeout 設 0 = 不限,見 workspace-client VIDEO_UPLOAD_TIMEOUT_MS) +export const MAX_VIDEO_BYTES = 90 * 1024 * 1024; // 90 MB(過渡值:對齊 nginx client_max_body_size 100M,留 10 MB buffer 給 multipart overhead,避免 HTTP 413。未來影片走 localhost 直連後可放寬) export interface UploadMediaOptions { /** 上傳進度 callback(0~100) */