diff --git a/src/api/upload.js b/src/api/upload.js index 18c3eb6..d27ec7f 100644 --- a/src/api/upload.js +++ b/src/api/upload.js @@ -39,8 +39,12 @@ export function uploadWork(group, formData, onProgress) { // 注意:不要手动设置 Content-Type: multipart/form-data(不带 boundary 会导致 // 后端 ctx.getFileStream() 报 Missing boundary 而 500)。交由 axios/浏览器自动 // 补带 boundary 的 multipart 头。字段顺序:先文本字段(file_type/work_name)再 file。 + // 🔴 R225:timeout 300s -> 600s。上传上限提至 150MB 后,服务器入口带宽约 + // 1.25MB/s 且为全体考生共享,单传约 120s、数人并发时可达 400s+; + // 原 300s 会让「限额已放开」的文件改以超时失败。 + // nginx 侧 /api/ 的 proxy_send_timeout/proxy_read_timeout 已是 600s,两者对齐。 return request.post(`/upload/${group}`, formData, { - timeout: 300000, + timeout: 600000, onUploadProgress: (e) => { if (onProgress && e.total) onProgress(Math.round((e.loaded / e.total) * 100)) }, diff --git a/src/utils/uploadCombo.js b/src/utils/uploadCombo.js index 5b54e03..e339dba 100644 --- a/src/utils/uploadCombo.js +++ b/src/utils/uploadCombo.js @@ -13,8 +13,14 @@ */ export const ALLOWED = ['.doc', '.docx', '.pdf', '.ppt', '.pptx', '.zip'] -export const ZIP_MAX = 200 * 1024 * 1024 -export const OTHER_MAX = 100 * 1024 * 1024 +// 上传大小上限:统一 150MB +// 🔴 2026-10-23 R225:原 ZIP_MAX=200MB / OTHER_MAX=100MB,与后端 +// config.multipart.fileSize(当时 '100mb')长期不一致 ⇒ 100~200MB 的 zip +// 前端放行、后端抛 MultipartFileTooLargeError,教师组因此报障。 +// 现前后端统一为 150MB(后端已同步改为 '150mb'),保持「前端放行 == 后端接收」。 +export const MAX_MB = 150 +export const ZIP_MAX = MAX_MB * 1024 * 1024 +export const OTHER_MAX = MAX_MB * 1024 * 1024 export function fileExt(name) { return (String(name).split('.').pop() || '').toLowerCase() @@ -42,7 +48,7 @@ export function validateSingleFile(name, size) { const e = '.' + fileExt(name) if (!ALLOWED.includes(e)) return `不支持的格式:${name}` const max = e === '.zip' ? ZIP_MAX : OTHER_MAX - if (size > max) return `${name} 超过大小限制(${e === '.zip' ? '200MB' : '100MB'})` + if (size > max) return `${name} 超过大小限制(${MAX_MB}MB)` return null } diff --git a/src/views/Competition.vue b/src/views/Competition.vue index b1c0564..84509ea 100644 --- a/src/views/Competition.vue +++ b/src/views/Competition.vue @@ -31,7 +31,7 @@ - 支持 docx / pdf / ppt / zip。规则:① zip 须单独上传(与任何其他文件互斥,自动覆盖);② pdf 与 docx 相互覆盖,只能保留其一;③ 若需同时提交文档与演示稿,请选「pdf + ppt」或「docx + ppt」组合。zip 上限 200MB,其余格式上限 100MB。 + 支持 docx / pdf / ppt / zip。规则:① zip 须单独上传(与任何其他文件互斥,自动覆盖);② pdf 与 docx 相互覆盖,只能保留其一;③ 若需同时提交文档与演示稿,请选「pdf + ppt」或「docx + ppt」组合。单个文件上限 150MB。