[BUG] 139(旧上传路径)和 Teldrive 覆盖上传时先删除原文件,上传失败或被取消后原文件丢失

未关闭
#3,329 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 3 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
68/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
go
领域
backend

调研方向

Start with drivers/teldrive/driver.go around lines 227–231 and drivers/139/driver.go around lines 852–917; compare when each path removes the existing file and how the 139 new-upload path handles replacement. Then read the shared op.Put behavior and the drivers’ Rename implementations. Done means a failed or cancelled overwrite preserves the original file, while a successful overwrite installs the new one.

由索引模型根据 Issue 内容生成。

描述

请确认以下事项
  • 我已确认阅读并同意 AGPL-3.0 第15条 。
    本程序不提供任何明示或暗示的担保,使用风险由您自行承担。

  • 我已确认阅读并同意 AGPL-3.0 第16条 。
    无论何种情况,版权持有人或其他分发者均不对使用本程序所造成的任何损失承担责任。

  • 我确认我的描述清晰,语法礼貌,能帮助开发者快速定位问题,并符合社区规则。

  • 我已确认阅读了OpenList文档。

  • 我已确认没有重复的问题或讨论。

  • 我已确认是OpenList的问题,而不是其他原因(例如 网络 ,依赖或操作)。

  • 我认为此问题必须由OpenList处理,而非第三方。

  • 我已确认这个问题在最新版本中没有被修复。

  • 我没有阅读这个清单,只是闭眼选中了所有的复选框,请关闭这个 Issue 。

OpenList 版本(必填)

v4.2.9

使用的存储驱动(必填)

中国移动云盘(139,存储类型为 personal,或 family / group 且开启了 use_old_stream_upload);Teldrive

问题描述(必填)

覆盖上传同名文件时,这两个驱动在新内容上传之前就把原文件删除了。上传一旦失败或被取消(网络中断、客户端断开、分片上传会话被中止或回收等),原文件已经没了,新文件也没有传上去,数据丢失。

  1. Teldrive:Put 一开始发现目标已存在,就直接 Remove,然后才开始上传。
    https://github.com/OpenListTeam/OpenList/blob/e72822f5390f4272c9fe9da8cabba3c1a270182f/drivers/teldrive/driver.go#L227-L231

  2. 139 旧上传路径(存储类型 personal,或 family / group 开启了 use_old_stream_upload):上传前先把同名旧文件改名、再删除。
    https://github.com/OpenListTeam/OpenList/blob/e72822f5390f4272c9fe9da8cabba3c1a270182f/drivers/139/driver.go#L893-L917

    作为对比,139 的新上传路径是在上传完成之后才删除旧文件、再把新文件改回原名,没有这个问题:
    https://github.com/OpenListTeam/OpenList/blob/e72822f5390f4272c9fe9da8cabba3c1a270182f/drivers/139/driver.go#L852-L889

修复思路(供参考):

  • 把删除旧文件挪到上传成功之后,和 139 新上传路径一致;或者
  • 在驱动的 config 里设置 NoOverwriteUpload: true,去掉驱动里自己的删除逻辑,交给 op.Put 统一处理"上传前把旧文件改名挪开、失败后改回"。两个驱动都已实现 Rename。上传被取消时的恢复问题在 #3330 中修复。
日志(必填)

无。这是在排查 #3178(取消的上传误删文件)时,通过代码审查发现的同类问题。我手头没有 139 和 Teldrive 账号,未实际运行复现。

配置文件内容(必填)

不适用:未实际运行,问题来自代码审查。

复现链接(可选)

无(需要对应网盘的账号)。按代码推测的复现步骤:

  1. 在 Teldrive 存储中已有文件 a.bin(139 同理,存储类型为 personal);
  2. 在网页上用同名文件 a.bin 覆盖上传,文件大一些,便于中途操作;
  3. 上传进行中取消上传或断开网络;
  4. 刷新列表:原来的 a.bin 已经不存在。
AI生成内容
  • 我使用了AI工具生成此内容
  • 我没有使用AI工具生成此内容
AI模型是

Claude Opus 5.5(Claude Code)

主要语言
Go
星标
25.3k
派生
2.4k
平均合并
3 天 1 小时
30 天内合并 PR
30

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

OpenListTeam/OpenList 的其他 Issue

查看 OpenListTeam/OpenList 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。