fix(upload): 分片用 multipart 字段 chunk、路由顺序与串行上传

- 前端 FormData+chunk,避免 raw body 被中间层断连
- Gin 分片路由置于 POST .../assets 之前
- 分片并发降为 1

Made-with: Cursor
This commit is contained in:
whm
2026-04-14 09:30:09 +08:00
parent cce3d158d5
commit 65574e3762
4 changed files with 43 additions and 8 deletions

View File

@@ -103,11 +103,14 @@ export const initMultipartUpload = (siteId, body) =>
export const getMultipartUploadStatus = (siteId, uploadId) =>
request.get(`/admin/sites/${siteId}/assets/multipart/${uploadId}/status`, { timeout: 60000 })
export const putMultipartChunk = (siteId, uploadId, chunkIndex, blob) =>
request.post(`/admin/sites/${siteId}/assets/multipart/${uploadId}/chunk/${chunkIndex}`, blob, {
headers: { 'Content-Type': 'application/octet-stream' },
export const putMultipartChunk = (siteId, uploadId, chunkIndex, blob) => {
const fd = new FormData()
fd.append('chunk', blob, 'part.bin')
// 不传 Content-Type由浏览器带 boundary与整文件 multipart 一致,减少中间层断连
return request.post(`/admin/sites/${siteId}/assets/multipart/${uploadId}/chunk/${chunkIndex}`, fd, {
timeout: 180000
})
}
export const completeMultipartUpload = (siteId, uploadId) =>
request.post(`/admin/sites/${siteId}/assets/multipart/${uploadId}/complete`, {}, { timeout: 600000 })

View File

@@ -9,7 +9,8 @@ import {
const CHUNK_THRESHOLD = 8 * 1024 * 1024
const DEFAULT_CHUNK_SIZE = 4 * 1024 * 1024
const UPLOAD_CONCURRENCY = 3
// 串行上传分片,避免 HTTP/2 多路复用 + 大 body 在部分反代上不稳定
const UPLOAD_CONCURRENCY = 1
function fileFingerprint(file) {
return `${file.name}\t${file.size}\t${file.lastModified}`