2026-09-12-上传跳过与改名保存功能.md

上传「跳过已存在 / 改名保存」功能改造记录


一、改动前的行为(核查结论)

文件大小上传路径重传行为
≤ 64MB一次 multipart POST 到当前目录写临时文件后 renameSync 覆盖同名文件,无存在性检查
> 64MB分块续传 /api/upload/chunk + /api/upload/complete全量重传 + 覆盖:续传进度只存在于 .upload-parts/<hash>/,而上传成功后会 fs.rmSync 删掉会话,所以 status 恒返回 exists:false

唯一存在的「跳过」是块级断点续传:仅当上次上传中途中断、会话目录仍在,且 fileSize 与 totalChunks 都一致时,才会跳过已收到的块;不一致则 abort 后从零传。

二、本次改动(3 项)

1. 新增「同名且大小一致 → 跳过」(秒传式)

2. 新增「同名但大小不同 → 改名保存(不覆盖)」

3. 修复:子目录里上传大文件会落到「用户上传」根目录(旧版 bug)

三、测试结果(端到端,23/23 通过)

测试脚本 /tmp/up-test.mjs(对 127.0.0.1:8899 真实 HTTP 调用,测试目录用后即删):

  1. 小文件首次 multipart 上传 → 200 + 内容正确
  2. 状态接口:同大小→done:true;大小不符→不跳过;不带 size→不跳过;目标不存在→不跳过
  3. 小文件 ?rename=1 重传 → renamed:true,原文件保留为 v1,新文件 small (2).txt 为 v2
  4. 小文件不带 rename 重传 → 覆盖成功(renamed:false)
  5. 大文件 67MB 分块(2 块)→ 分块 200、会话记录 2/2、合并成功且落盘在当前子目录、内容逐字节一致、完成后 done:true、会话已清理(再 complete 返回 404)
  6. 大文件合并时 rename:true → renamed:true,另存 big (2).bin 且原 big.bin 保留
  7. 页面注入:子目录 __UP_REL__="zz-上传功能测试"、根目录为空串、桌面页与移动页均含两个复选框;页面内联 JS 通过 node --check

服务端 node --check 通过;已备份原文件为 ~/Downloads/download-server.js.bak-20260912-214503。

四、使用说明与注意事项

五、运维提醒(重要)

六、回滚方式

cp ~/Downloads/download-server.js.bak-20260912-214503 ~/Downloads/download-server.js
bash ~/Downloads/restart-dl-server.sh   # 注意:会中断在传分块

七、相关文件

下载此文件