uploadId 与各分片 ETag 持久化于 {chunk_path}/{file_id}/session.json,跨请求断点续传putFile 上传(SDK 内部自动断点续传)mergeChunk 新增选项:file_hash(整文件散列作为最终对象名,未传时用 file_id)、mime_type(云端无法探测 MIME,默认 application/octet-stream)Storage::disk('oss', false)->uploadChunk(...) / chunkProgress(...) / mergeChunk(...)AdapterAbstract,能力矩阵云端分片全部置 ✅案例脚本
chunk-upload-test.sh ./tinywan.mp4 http://127.0.0.1:8487
上传输出
==> 切片(5m/片)...
共 8 片,file_id=demo-1787494666,disk=local
==> 逐片上传...
[1/8] chunk_aa md5=c5e5c60b22744e1d849b44dbd9fcad65
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":0,"save_name":"00000000.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000000.part","size":5242880,"md5":"c5e5c60b22744e1d849b44dbd9fcad65"}}
[2/8] chunk_ab md5=4787b2da8647ff76a7151234cfdd195b
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":1,"save_name":"00000001.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000001.part","size":5242880,"md5":"4787b2da8647ff76a7151234cfdd195b"}}
[3/8] chunk_ac md5=e305afe8bdb970b5196c57d5eaeccf12
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":2,"save_name":"00000002.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000002.part","size":5242880,"md5":"e305afe8bdb970b5196c57d5eaeccf12"}}
[4/8] chunk_ad md5=5dfa4e9cbc57810294aaf20a26365999
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":3,"save_name":"00000003.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000003.part","size":5242880,"md5":"5dfa4e9cbc57810294aaf20a26365999"}}
[5/8] chunk_ae md5=9833acb5c1b42a55d97592663d0a2712
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":4,"save_name":"00000004.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000004.part","size":5242880,"md5":"9833acb5c1b42a55d97592663d0a2712"}}
[6/8] chunk_af md5=74eebed480b521b040cb90d72c247548
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":5,"save_name":"00000005.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000005.part","size":5242880,"md5":"74eebed480b521b040cb90d72c247548"}}
[7/8] chunk_ag md5=f18389eccf9062c82e750bf3c9e92d0d
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":6,"save_name":"00000006.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000006.part","size":5242880,"md5":"f18389eccf9062c82e750bf3c9e92d0d"}}
[8/8] chunk_ah md5=ca945b59e99f0b2c3813b64b5330d6b0
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","chunk_index":7,"save_name":"00000007.part","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/runtime/storage/.chunks/demo-1787494666/00000007.part","size":1187178,"md5":"ca945b59e99f0b2c3813b64b5330d6b0"}}
==> 查询上传进度...
{"code":0,"msg":"ok","data":{"file_id":"demo-1787494666","total":8,"uploaded":[0,1,2,3,4,5,6,7],"missing":[],"finished":true}}
==> 合并分片(file_hash=10a1451dc1bbf8207854c4024884b08787ae07c2)...
{"code":0,"msg":"ok","data":{"origin_name":"Connection类的使用.mp4","save_name":"10a1451dc1bbf8207854c4024884b08787ae07c2.mp4","save_path":"/var/www/webman/plugin.v2.webman.tinywan.com/public/storage/20260823/10a1451dc1bbf8207854c4024884b08787ae07c2.mp4","url":"http://127.0.0.1:8487/storage/20260823/10a1451dc1bbf8207854c4024884b08787ae07c2.mp4","unique_id":"10a1451dc1bbf8207854c4024884b08787ae07c2","size":37887338,"mime_type":"video/mp4","extension":"mp4"}}
==> 校验散列...
原文件 sha1:10a1451dc1bbf8207854c4024884b08787ae07c2
✅ 合并产物散列与原文件一致,测试通过
查询进度
{
"code": 0,
"msg": "ok",
"data": {
"file_id": "demo-1787494666",
"total": 8,
"uploaded": [
0,
1,
2,
3,
4,
5,
6,
7
],
"missing": [],
"finished": true
}
}
合并分片
{
"code": 0,
"msg": "ok",
"data": {
"origin_name": "Connection类的使用.mp4",
"save_name": "10a1451dc1bbf8207854c4024884b08787ae07c2.mp4",
"save_path": "/var/www/webman/plugin.v2.webman.tinywan.com/public/storage/20260823/10a1451dc1bbf8207854c4024884b08787ae07c2.mp4",
"url": "http://127.0.0.1:8487/storage/20260823/10a1451dc1bbf8207854c4024884b08787ae07c2.mp4",
"unique_id": "10a1451dc1bbf8207854c4024884b08787ae07c2",
"size": 37887338,
"mime_type": "video/mp4",
"extension": "mp4"
}
}