fix(upload): 分片用 multipart 字段 chunk、路由顺序与串行上传
- 前端 FormData+chunk,避免 raw body 被中间层断连 - Gin 分片路由置于 POST .../assets 之前 - 分片并发降为 1 Made-with: Cursor
This commit is contained in:
@@ -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 })
|
||||
|
||||
@@ -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}`
|
||||
|
||||
Reference in New Issue
Block a user