AlistGo / alist

🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs. / 一个支持多存储的文件列表/WebDAV程序,使用 Gin 和 Solidjs。
https://alist.nn.ci
GNU Affero General Public License v3.0
44.41k stars 5.76k forks source link

Webdav 上传到本地遗失元数据(如修改时间) #4242

Closed potoo0 closed 1 year ago

potoo0 commented 1 year ago

Please make sure of the following things

Alist Version / Alist 版本

v3.16.0

Driver used / 使用的存储驱动

local

Describe the bug / 问题描述

例如使用 rclone,复制到 alist 的本地挂载。原始文件修改时间是 2023-04-06 11:22:11,上传后时间变成了当前时间(2023-04-26 12:30:05)

# ls -hl src
rclone copy src alist:/local/temp -P -vv

Reproduction / 复现链接

noop

Logs / 日志

No response

welcome[bot] commented 1 year ago

Thanks for opening your first issue here! Be sure to follow the issue template!

github-actions[bot] commented 1 year ago

See

  1. 85% #82
  2. 53% #3021
  3. 50% #3483
  4. 50% #1700
  5. 50% #918
  6. 50% #831
stale[bot] commented 1 year ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

github-actions[bot] commented 1 year ago

Hello @, this issue was closed due to inactive more than 52 days. You can reopen or recreate it if you think it should continue. Thank you for your contributions again.

potoo0 commented 1 year ago

已经被解决: 4938#issuecomment-1694687680

本人使用正常

jiongxuan commented 11 months ago

已经被解决: 4938#issuecomment-1694687680

本人使用正常

@potoo0 您好,麻烦问下这个是怎么解决的?

我目前使用最新版本,仍存在这个问题。使用本地挂载 + 复制到阿里云盘,还是出现 文件修改日期 改为 同步日期 的情况。

potoo0 commented 11 months ago

已经被解决: 4938#issuecomment-1694687680 本人使用正常

@potoo0 您好,麻烦问下这个是怎么解决的?

我目前使用最新版本,仍存在这个问题。使用本地挂载 + 复制到阿里云盘,还是出现 文件修改日期 改为 同步日期 的情况。

其他的我不清楚,我的是使用 rclone 做客户端向 alist 同步文件,而 rclone 多对原标准的 webdav 做了扩展:使用 X-OC-Mtime header 来传递修改时间。所以只要客户端和服务端双方都支持这个参数就可以了,而 alist 是在我提到的那次更改中增加了 X-OC-Mtime,这样 rclone 就能与 alist 传递修改时间。

jiongxuan commented 11 months ago

已经被解决: 4938#issuecomment-1694687680 本人使用正常

@potoo0 您好,麻烦问下这个是怎么解决的? 我目前使用最新版本,仍存在这个问题。使用本地挂载 + 复制到阿里云盘,还是出现 文件修改日期 改为 同步日期 的情况。

其他的我不清楚,我的是使用 rclone 做客户端向 alist 同步文件,而 rclone 多对原标准的 webdav 做了扩展:使用 X-OC-Mtime header 来传递修改时间。所以只要客户端和服务端双方都支持这个参数就可以了,而 alist 是在我提到的那次更改中增加了 X-OC-Mtime,这样 rclone 就能与 alist 传递修改时间。

讲的很详细,感谢!我一会儿搭建 RClone 做同步试试。

另外,您使用的是哪个驱动呢?我用的是 阿里云盘 Open。 @potoo0

jiongxuan commented 11 months ago

我搭建了Rclone,还是不行,而且还会重复上传(因为修改日期不保留,每次对比时间都和源文件不同)。

问了 阿里云盘 客服,对方表示不支持保留文件修改日期。看来至少 阿里云盘 是不可以了。您也可以看下,是不是近期也复现了这个问题。@rotoo0

IMG_8721

cnjackchen commented 10 months ago

我也遇到这个问题。 我用alist挂载网盘主要用途是备份,丢失文件修改时间等元数据让所有的同步备份软件失效,无法实现差异备份。 阿里云盘、天翼云盘、百度网盘试过都不行。 Windows下RaiDrive、RClone挂载都不行。

huoxingdawang commented 10 months ago

我也遇到了上面的问题,每一次备份都是从头开始备份。

potoo0 commented 10 months ago

rclone 的 vendor 要设置正确,不然不会处理 OC-Time 的。

rclone 支持的 OC-Time 的 vendor (源码 https://github.com/rclone/rclone/blob/783599114760d09684bc5ed44f4209813d127484/backend/webdav/webdav.go#L581):

配合 alist 的话只能使用 fastmailrclone

potoo0 commented 10 months ago

看到上面很多人有问题,我这里又测试了一遍,还是没有发现问题。

写下我的测试过程:

rclone.conf:

[alist]
type = webdav
url = https://xxx.cn/dav
vendor = fastmail
user = admin
pass = xxx

测试目录结构:

test_oc_time_ws
├── init.sh
├── ws1.txt
└── ws2.txt

脚本:

RC_REMOTE=alist:local/z-tmp/test_bisync

# 复制命令 cmd-copy-to_remote
alias cmd-copy-to_remote='rclone copy . $RC_REMOTE -vvv'

# 复制命令 cmd-copy-from_remote
alias cmd-copy-from_remote='rclone copy $RC_REMOTE . -vvv'

# 同步命令 cmd-sync
alias cmd-sync='rclone bisync . $RC_REMOTE -vvv'

# 查看远程文件命令 cmd-cat
alias cmd-cat='rclone lsl $RC_REMOTE ; echo "---" ; rclone cat "$RC_REMOTE/ws1.txt" ; echo "---" ; rclone cat "$RC_REMOTE/ws2.txt"'

# 机器1: wsl, 修改文件命令 cmd-edit-workspace1
alias cmd-edit-ws1='echo "ws1 $(date -Iseconds)" | tee -a ws1.txt'

# 机器2: vm, 修改文件命令 cmd-edit-workspace2
alias cmd-edit-ws2='echo "ws2 $(date -Iseconds)" | tee -a ws2.txt'

bisync 注意事项:

  1. 首次执行 bisync 时需要加参数 --resync,会产生一些 cache 文件( ~/.cache/rclone )
  2. bisync 要慎重使用,建议每次加参数 --dry-run 先确认无误

测试流程:

# 准备文件
1. wsl: cmd-edit-ws1
2. wsl: cmd-sync (首次执行加 --resync)
3. wsl: cmd-cat
4. vm: cmd-copy-from_remote
5. vm: cmd-edit-ws2
6. vm: cmd-sync (首次执行加 --resync)
7. vm: cmd-cat

# 测试
1. wsl: cmd-edit-ws1
2. wsl: cmd-sync
3. wsl: cmd-cat
4. vm: cmd-edit-ws2
5. vm: cmd-sync
6. vm: cmd-cat

wsl 测试输出的关键日志:

# ubt @ aero15 in ~/test_oc_time_ws1 [12:25:11]
$ cmd-edit-ws1
ws1 2024-01-25T12:26:06+08:00

# ubt @ aero15 in ~/test_oc_time_ws1 [12:26:06]
$ cmd-sync
2024/01/25 12:26:10 DEBUG : rclone: Version "v1.65.2" starting with parameters ["rclone" "bisync" "." "alist:local/z-tmp/test_bisync" "-vvv"]
2024/01/25 12:26:10 DEBUG : Creating backend with remote "."
2024/01/25 12:26:10 DEBUG : Using config file from "/home/ubt/.config/rclone/rclone.conf"
2024/01/25 12:26:10 DEBUG : fs cache: renaming cache item "." to be canonical "/home/ubt/test_oc_time_ws1"
2024/01/25 12:26:10 DEBUG : Creating backend with remote "alist:local/z-tmp/test_bisync"
2024/01/25 12:26:10 DEBUG : found headers:
2024/01/25 12:26:10 NOTICE: bisync is EXPERIMENTAL. Don't use in production!
2024/01/25 12:26:10 DEBUG : Lock file created: /home/ubt/.cache/rclone/bisync/home_ubt_test_oc_time_ws1..alist_local_z-tmp_test_bisync.lck
2024/01/25 12:26:10 INFO  : Synching Path1 "/home/ubt/test_oc_time_ws1/" with Path2 "alist:local/z-tmp/test_bisync/"
2024/01/25 12:26:10 INFO  : Path1 checking for diffs
2024/01/25 12:26:10 INFO  : - Path1    File is newer                       - ws1.txt
2024/01/25 12:26:10 INFO  : Path1:    1 changes:    0 new,    1 newer,    0 older,    0 deleted
2024/01/25 12:26:10 INFO  : Path2 checking for diffs
2024/01/25 12:26:10 INFO  : - Path2    File is newer                       - ws2.txt
2024/01/25 12:26:10 INFO  : Path2:    1 changes:    0 new,    1 newer,    0 older,    0 deleted
2024/01/25 12:26:10 INFO  : Applying changes
2024/01/25 12:26:10 INFO  : - Path1    Queue copy to Path2                 - alist:local/z-tmp/test_bisync/ws1.txt
2024/01/25 12:26:10 INFO  : - Path2    Queue copy to Path1                 - /home/ubt/test_oc_time_ws1/ws2.txt
2024/01/25 12:26:10 INFO  : - Path2    Do queued copies to                 - Path1
2024/01/25 12:26:10 DEBUG : init.sh: Excluded
2024/01/25 12:26:10 DEBUG : ws1.txt: Excluded
2024/01/25 12:26:10 DEBUG : ws2.txt: Sizes differ (src 60 vs dst 30)
2024/01/25 12:26:10 DEBUG : Local file system at /home/ubt/test_oc_time_ws1: Waiting for checks to finish
2024/01/25 12:26:10 DEBUG : Local file system at /home/ubt/test_oc_time_ws1: Waiting for transfers to finish
2024/01/25 12:26:10 DEBUG : ws2.txt: Src hash empty - aborting Dst hash check
2024/01/25 12:26:10 DEBUG : ws2.txt.yosubur9.partial: renamed to: ws2.txt
2024/01/25 12:26:10 INFO  : ws2.txt: Copied (replaced existing)
2024/01/25 12:26:10 INFO  : - Path1    Do queued copies to                 - Path2
2024/01/25 12:26:10 DEBUG : init.sh: Excluded
2024/01/25 12:26:10 DEBUG : ws2.txt: Excluded
2024/01/25 12:26:10 DEBUG : ws1.txt: Sizes differ (src 90 vs dst 60)
2024/01/25 12:26:10 DEBUG : webdav root 'local/z-tmp/test_bisync': Waiting for checks to finish
2024/01/25 12:26:10 DEBUG : webdav root 'local/z-tmp/test_bisync': Waiting for transfers to finish
2024/01/25 12:26:10 DEBUG : ws1.txt: Update will use the normal upload strategy (no chunks)
2024/01/25 12:26:11 DEBUG : ws1.txt: Dst hash empty - aborting Src hash check
2024/01/25 12:26:11 INFO  : ws1.txt: Copied (replaced existing)
2024/01/25 12:26:11 INFO  : Updating listings
2024/01/25 12:26:11 INFO  : Validating listings for Path1 "/home/ubt/test_oc_time_ws1/" vs Path2 "alist:local/z-tmp/test_bisync/"
2024/01/25 12:26:11 DEBUG : Lock file removed: /home/ubt/.cache/rclone/bisync/home_ubt_test_oc_time_ws1..alist_local_z-tmp_test_bisync.lck
2024/01/25 12:26:11 INFO  : Bisync successful
2024/01/25 12:26:11 INFO  :
Transferred:            150 B / 150 B, 100%, 0 B/s, ETA -
Checks:                 2 / 2, 100%
Transferred:            2 / 2, 100%
Elapsed time:         0.1s

2024/01/25 12:26:11 DEBUG : 8 go routines active

# ubt @ aero15 in ~/test_oc_time_ws1 [12:26:11]
$ cmd-cat
      473 2024-01-25 11:23:39.000000000 init.sh
       90 2024-01-25 12:26:06.000000000 ws1.txt
       60 2024-01-25 12:25:49.000000000 ws2.txt
---
ws1 2024-01-25T12:17:53+08:00
ws1 2024-01-25T12:24:49+08:00
ws1 2024-01-25T12:26:06+08:00
---
ws2 2024-01-25T12:23:59+08:00
ws2 2024-01-25T12:25:49+08:00

vm 测试输出的关键日志:

# root @ ecs-2c2g3m in ~/test_oc_time_ws2 [12:25:42]
$ cmd-edit-ws2
ws2 2024-01-25T12:25:49+08:00

# root @ ecs-2c2g3m in ~/test_oc_time_ws2 [12:25:49]
$ cmd-sync
2024/01/25 12:25:54 DEBUG : rclone: Version "v1.65.2" starting with parameters ["rclone" "bisync" "." "alist:local/z-tmp/test_bisync" "-vvv"]
2024/01/25 12:25:54 DEBUG : Creating backend with remote "."
2024/01/25 12:25:54 DEBUG : Using config file from "/root/.config/rclone/rclone.conf"
2024/01/25 12:25:54 DEBUG : fs cache: renaming cache item "." to be canonical "/root/test_oc_time_ws2"
2024/01/25 12:25:54 DEBUG : Creating backend with remote "alist:local/z-tmp/test_bisync"
2024/01/25 12:25:54 DEBUG : found headers:
2024/01/25 12:25:54 NOTICE: bisync is EXPERIMENTAL. Don't use in production!
2024/01/25 12:25:54 DEBUG : Lock file created: /root/.cache/rclone/bisync/root_test_oc_time_ws2..alist_local_z-tmp_test_bisync.lck
2024/01/25 12:25:54 INFO  : Synching Path1 "/root/test_oc_time_ws2/" with Path2 "alist:local/z-tmp/test_bisync/"
2024/01/25 12:25:54 INFO  : Path1 checking for diffs
2024/01/25 12:25:54 INFO  : - Path1    File is newer                       - ws2.txt
2024/01/25 12:25:54 INFO  : Path1:    1 changes:    0 new,    1 newer,    0 older,    0 deleted
2024/01/25 12:25:54 INFO  : Path2 checking for diffs
2024/01/25 12:25:54 INFO  : - Path2    File is newer                       - ws1.txt
2024/01/25 12:25:54 INFO  : Path2:    1 changes:    0 new,    1 newer,    0 older,    0 deleted
2024/01/25 12:25:54 INFO  : Applying changes
2024/01/25 12:25:54 INFO  : - Path1    Queue copy to Path2                 - alist:local/z-tmp/test_bisync/ws2.txt
2024/01/25 12:25:54 INFO  : - Path2    Queue copy to Path1                 - /root/test_oc_time_ws2/ws1.txt
2024/01/25 12:25:54 INFO  : - Path2    Do queued copies to                 - Path1
2024/01/25 12:25:54 DEBUG : init.sh: Excluded
2024/01/25 12:25:54 DEBUG : ws2.txt: Excluded
2024/01/25 12:25:54 DEBUG : ws1.txt: Sizes differ (src 60 vs dst 30)
2024/01/25 12:25:54 DEBUG : Local file system at /root/test_oc_time_ws2: Waiting for checks to finish
2024/01/25 12:25:54 DEBUG : Local file system at /root/test_oc_time_ws2: Waiting for transfers to finish
2024/01/25 12:25:54 DEBUG : ws1.txt: Src hash empty - aborting Dst hash check
2024/01/25 12:25:54 DEBUG : ws1.txt.yizijik1.partial: renamed to: ws1.txt
2024/01/25 12:25:54 INFO  : ws1.txt: Copied (replaced existing)
2024/01/25 12:25:54 INFO  : - Path1    Do queued copies to                 - Path2
2024/01/25 12:25:54 DEBUG : init.sh: Excluded
2024/01/25 12:25:54 DEBUG : ws1.txt: Excluded
2024/01/25 12:25:54 DEBUG : ws2.txt: Sizes differ (src 60 vs dst 30)
2024/01/25 12:25:54 DEBUG : webdav root 'local/z-tmp/test_bisync': Waiting for checks to finish
2024/01/25 12:25:54 DEBUG : webdav root 'local/z-tmp/test_bisync': Waiting for transfers to finish
2024/01/25 12:25:54 DEBUG : ws2.txt: Update will use the normal upload strategy (no chunks)
2024/01/25 12:25:54 DEBUG : ws2.txt: Dst hash empty - aborting Src hash check
2024/01/25 12:25:54 INFO  : ws2.txt: Copied (replaced existing)
2024/01/25 12:25:54 INFO  : Updating listings
2024/01/25 12:25:54 INFO  : Validating listings for Path1 "/root/test_oc_time_ws2/" vs Path2 "alist:local/z-tmp/test_bisync/"
2024/01/25 12:25:54 DEBUG : Lock file removed: /root/.cache/rclone/bisync/root_test_oc_time_ws2..alist_local_z-tmp_test_bisync.lck
2024/01/25 12:25:54 INFO  : Bisync successful
2024/01/25 12:25:54 INFO  :
Transferred:            120 B / 120 B, 100%, 0 B/s, ETA -
Checks:                 2 / 2, 100%
Transferred:            2 / 2, 100%
Elapsed time:         0.1s

2024/01/25 12:25:54 DEBUG : 9 go routines active

# root @ ecs-2c2g3m in ~/test_oc_time_ws2 [12:25:54]
$ cmd-cat
      473 2024-01-25 11:23:39.000000000 init.sh
       60 2024-01-25 12:24:49.000000000 ws1.txt
       60 2024-01-25 12:25:49.000000000 ws2.txt
---
ws1 2024-01-25T12:17:53+08:00
ws1 2024-01-25T12:24:49+08:00
---
ws2 2024-01-25T12:23:59+08:00
ws2 2024-01-25T12:25:49+08:00

# root @ ecs-2c2g3m in ~/test_oc_time_ws2 [12:25:59]
$

完整输出附件

potoo0 commented 10 months ago

@jiongxuan @cnjackchen @huoxingdawang 试下我上面的贴出来的测试过程

huoxingdawang commented 10 months ago

我大概知道是为什么了,我用truenas scale备份,但是这个truenas scale不大愿意等alist上传,然后我的文件都比较大,truenas scale的rclone传给alist以后没等alist上传到网盘truenas scale就觉的超时了,然后取消掉这个文件的上传再发一遍新的,然后他就进入了一种死循环不停重发同一个文件,造成了一种没有元数据不停上传同一个文件的假象。。。。。

具体的解决办法是在truenas scale里用这条指令让rclone的超时时间变长

midclt call cloudsync.update 6 '{ "args": "--rc-server-read-timeout 6d --rc-server-write-timeout 6d --timeout 6d" }'

我在truenas论坛上发了一个帖子,虽然没有什么detail

mo-han commented 7 months ago

@potoo0 建议放弃,就当这个存储是不支持mtime保持的特性的,不要依赖它。云端服务商不支持的,再折腾也没用。服务商支持的,参数不到位,或者使用平台不支持参数,还是白瞎。靠不住的东西就不要去靠,当它不存在。

potoo0 commented 7 months ago

@potoo0 建议放弃,就当这个存储是不支持mtime保持的特性的,不要依赖它。云端服务商不支持的,再折腾也没用。服务商支持的,参数不到位,或者使用平台不支持参数,还是白瞎。靠不住的东西就不要去靠,当它不存在。

选择正确的工具及配置就没问题,会有人愿意追根究底查明适用场景,而不应该用简单一句话否定。 例如我现在通过 rclone 来同步文件到 onedrive 和自建的 alist 没有一丁点问题。

mo-han commented 7 months ago

选择正确的工具及配置就没问题,会有人愿意追根究底查明适用场景,而不应该用简单一句话否定。 例如我现在通过 rclone 来同步文件到 onedrive 和自建的 alist 没有一丁点问题。

这是个事关建设性的问题。如果整个系统各个环节都在社区掌控中,或者环节的掌控者都为自组织、自协商、自演化预留了接口,并愿意长期维护这些接口,那么整个系统将朝着健康的方向发展。但现在是云端厂商单方面地掐死了这种可能性,或者虽然保留了可能性却不稳定,那么这就给整个系统的演化引入了负建设性。这些负面性不是社区的过错,社区不为此负责,不为其善后,直接切割、剜除才是正道。

jiongxuan commented 7 months ago

@jiongxuan @cnjackchen @huoxingdawang 试下我上面的贴出来的测试过程

选择正确的工具及配置就没问题,会有人愿意追根究底查明适用场景,而不应该用简单一句话否定。 例如我现在通过 rclone 来同步文件到 onedrive 和自建的 alist 没有一丁点问题。

测试的很详细,谢谢。不过我的 vendor 用的是 rclone,在 阿里云 上 仍然复现。

话说,您测试的网盘是哪个?如果是 OneDrive 是没问题的,我也试了,但 阿里云 目前试了不行。

您有空的话,可以用上述方法在 阿里云、百度云 再验证下 @potoo0

jiongxuan commented 7 months ago

选择正确的工具及配置就没问题,会有人愿意追根究底查明适用场景,而不应该用简单一句话否定。 例如我现在通过 rclone 来同步文件到 onedrive 和自建的 alist 没有一丁点问题。

这是个事关建设性的问题。如果整个系统各个环节都在社区掌控中,或者环节的掌控者都为自组织、自协商、自演化预留了接口,并愿意长期维护这些接口,那么整个系统将朝着健康的方向发展。但现在是云端厂商单方面地掐死了这种可能性,或者虽然保留了可能性却不稳定,那么这就给整个系统的演化引入了负建设性。这些负面性不是社区的过错,社区不为此负责,不为其善后,直接切割、剜除才是正道。

@mo-han 赞同。像这种“云端厂商不可控”的地方,做好标注,避免后面同学踩坑就好。这也是我当时粘贴“客服截图”的目的。

不过作者也的确做了实验验证,值得肯定,唯一就是再用相同环境、相同设备,再验证下 阿里云、百度云 的情况,做个 Double Check 就好

potoo0 commented 7 months ago

选择正确的工具及配置就没问题,会有人愿意追根究底查明适用场景,而不应该用简单一句话否定。 例如我现在通过 rclone 来同步文件到 onedrive 和自建的 alist 没有一丁点问题。

@jiongxuan

简称和协定:

我之前说的两种同步完整是这样:

XXX=onedrive,我今天(20240418)测试发现其实是不行的,始终会更新所有文件的 modtime,alist 源码 onedrive.Put upSmall/upBig 没有像 rclone setModTime 的逻辑。而 rclone 不支持只比较 checkSum 而忽略时间,源码 operations.NeedTransfer 能看到一旦忽略时间后就立即返回 true,而忽略了后面 checkSum 一堆逻辑。


总结:

已知的 XXX存储 情况:

其他的先根据源码给个初步结论(下面 OK 只是说源码设置了时间,但网盘存不存不清楚,后面几天我会陆续补充验证):


update via releases v3.34.0

目前状态(v3.34.0):

potoo0 commented 7 months ago

@jiongxuan

百度云的我昨天晚上发现了个 bug,提交已经代码,到时候你测测看,我本地验证没有修改时间 问题了。 fix(BaiduNetdisk) fix cached Ctime/Mtime

至于 阿里云的目前无解: 文件列表接口问题

ypq123456789 commented 6 months ago

@jiongxuan

百度云的我昨天晚上发现了个 bug,提交已经代码,到时候你测测看,我本地验证没有修改时间 问题了。 fix(BaiduNetdisk) fix cached Ctime/Mtime

至于 阿里云的目前无解: 文件列表接口问题

我要是早看到你这个专业回答也不至于踩这么多坑了。原来阿里云盘根本就不支持将修改时间显示为源文件的修改时间,而是强制设置为上传时间。我以前以为是webdav协议的问题,现在才知道是阿里的问题。奇怪的是,即使我设置了--size only,从od同步到阿里云盘加密盘还是会遇到重复上传的问题。

ypq123456789 commented 6 months ago

@jiongxuan

百度云的我昨天晚上发现了个 bug,提交已经代码,到时候你测测看,我本地验证没有修改时间 问题了。 fix(BaiduNetdisk) fix cached Ctime/Mtime

至于 阿里云的目前无解: 文件列表接口问题

Screenshot_20240510_005200_com alibaba android rimet 大佬我把你在阿里云盘openapi文档下面的提问发到阿里云盘开发者钉钉群里询问了,有个人这么回复的,你看看是这样的吗

potoo0 commented 6 months ago

大佬我把你在阿里云盘openapi文档下面的提问发到阿里云盘开发者钉钉群里询问了,有个人这么回复的,你看看是这样的吗

@ypq123456789

不是的,我那里的文件创建时设置了,只不过过程评论放在了《文件上传》页面,没有放在《获取文件列表》页面,我刚补充评论链接了。

另外你怎么进开发群的?我四月底提交了申请和意见,但现在没有任何批准或回复。


为方便查阅这里也把评论内容复制过来。

文件上传

测试脚本:

token='xx'

create_data='{
    "drive_id": "xx",
    "parent_file_id": "xx",
    "name": "ws1.txt",
    "type": "file",
    "check_name_mode": "ignore",
    "local_modified_at": "2024-04-20T12:00:01.000Z",
    "local_created_at": "2024-04-20T12:10:02.000Z"
}'

# 1. create
create_resp=$(curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/create' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$create_data")
echo "create_resp=$create_resp"

# 2. get upload url
# get_upload_req=$(jq -n \
#     --arg drive_id $(jq -r '.drive_id' <<< $create_data) \
#     --arg file_id $(jq -r '.file_id' <<< $create_resp) \
#     --arg upload_id $(jq -r '.upload_id' <<< $create_resp) \
#     --argjson part_info_list '[{"part_number": 1}]' \
#     '$ARGS.named')
# echo "get_upload_req=$get_upload_req"
# get_upload_resp=$(curl --location --request POST \
#     'https://open.aliyundrive.com/adrive/v1.0/openFile/getUploadUrl' \
#     --header "Authorization: Bearer $token" \
#     --header 'Content-Type: application/json' \
#     --data-raw "$get_upload_req")
# echo "get_upload_resp=$get_upload_resp"

# 3. upload
# upload_url=$(jq -r '.part_info_list[0].upload_url' <<< $get_upload_resp)
# upload_url=$(jq -r '.part_info_list[0].upload_url' <<< $create_resp)
# echo "upload_url=$upload_url"
# curl --location --request PUT \
#     "$upload_url" \
#     --data-binary /tmp/test_modtime.txt

# 4. complete
complete_req=$(jq -n \
    --arg drive_id $(jq -r '.drive_id' <<< $create_data) \
    --arg file_id $(jq -r '.file_id' <<< $create_resp) \
    --arg upload_id $(jq -r '.upload_id' <<< $create_resp) \
    '$ARGS.named')
curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/complete' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$complete_req"

获取文件列表

local_created_at/local_modified_at 永远为 null

测试脚本:

token='xx'

list_req='{
    "drive_id": "xx",
    "parent_file_id": "xx"
}'

list_resq=$(curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/list' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$list_req")
jq '.items[] | {name,file_id,created_at,updated_at,local_created_at,local_modified_at}' <<< $list_resq

输出:

{
  "name": "ws1.txt",
  "file_id": "6623bbd678bf7176300543669e7395d3ba0d93cf",
  "created_at": "2024-04-20T12:57:58.870Z",
  "updated_at": "2024-04-20T12:57:59.179Z",
  "local_created_at": null,
  "local_modified_at": null
}
{
  "name": "ws2.txt",
  "file_id": "6623b94f9ff3add28a4a40fa9bfe8d6b7d688814",
  "created_at": "2024-04-20T12:47:11.186Z",
  "updated_at": "2024-04-20T12:47:11.570Z",
  "local_created_at": null,
  "local_modified_at": null
}
ypq123456789 commented 6 months ago

大佬我把你在阿里云盘openapi文档下面的提问发到阿里云盘开发者钉钉群里询问了,有个人这么回复的,你看看是这样的吗

@ypq123456789

不是的,我那里的文件创建时设置了,只不过过程评论放在了《文件上传》页面,没有放在《获取文件列表》页面,我刚补充评论链接了。

另外你怎么进开发群的?我四月底提交了申请和意见,但现在没有任何批准或回复。

为方便查阅这里也把评论内容复制过来。

文件上传

  • /adrive/v1.0/openFile/create 接口 local_created_at/local_modified_at 但是在完成之前都是 null
  • /adrive/v1.0/openFile/complete 接口 local_created_at/local_modified_at,此值就是文件的时间,而不是接口时间
  • /adrive/v1.0/openFile/list 接口 local_created_at/local_modified_at 的值也是 null???

测试脚本:

token='xx'

create_data='{
    "drive_id": "xx",
    "parent_file_id": "xx",
    "name": "ws1.txt",
    "type": "file",
    "check_name_mode": "ignore",
    "local_modified_at": "2024-04-20T12:00:01.000Z",
    "local_created_at": "2024-04-20T12:10:02.000Z"
}'

# 1. create
create_resp=$(curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/create' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$create_data")
echo "create_resp=$create_resp"

# 2. get upload url
# get_upload_req=$(jq -n \
#     --arg drive_id $(jq -r '.drive_id' <<< $create_data) \
#     --arg file_id $(jq -r '.file_id' <<< $create_resp) \
#     --arg upload_id $(jq -r '.upload_id' <<< $create_resp) \
#     --argjson part_info_list '[{"part_number": 1}]' \
#     '$ARGS.named')
# echo "get_upload_req=$get_upload_req"
# get_upload_resp=$(curl --location --request POST \
#     'https://open.aliyundrive.com/adrive/v1.0/openFile/getUploadUrl' \
#     --header "Authorization: Bearer $token" \
#     --header 'Content-Type: application/json' \
#     --data-raw "$get_upload_req")
# echo "get_upload_resp=$get_upload_resp"

# 3. upload
# upload_url=$(jq -r '.part_info_list[0].upload_url' <<< $get_upload_resp)
# upload_url=$(jq -r '.part_info_list[0].upload_url' <<< $create_resp)
# echo "upload_url=$upload_url"
# curl --location --request PUT \
#     "$upload_url" \
#     --data-binary /tmp/test_modtime.txt

# 4. complete
complete_req=$(jq -n \
    --arg drive_id $(jq -r '.drive_id' <<< $create_data) \
    --arg file_id $(jq -r '.file_id' <<< $create_resp) \
    --arg upload_id $(jq -r '.upload_id' <<< $create_resp) \
    '$ARGS.named')
curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/complete' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$complete_req"

获取文件列表

local_created_at/local_modified_at 永远为 null

测试脚本:

token='xx'

list_req='{
    "drive_id": "xx",
    "parent_file_id": "xx"
}'

list_resq=$(curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/list' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$list_req")
jq '.items[] | {name,file_id,created_at,updated_at,local_created_at,local_modified_at}' <<< $list_resq

输出:

{
  "name": "ws1.txt",
  "file_id": "6623bbd678bf7176300543669e7395d3ba0d93cf",
  "created_at": "2024-04-20T12:57:58.870Z",
  "updated_at": "2024-04-20T12:57:59.179Z",
  "local_created_at": null,
  "local_modified_at": null
}
{
  "name": "ws2.txt",
  "file_id": "6623b94f9ff3add28a4a40fa9bfe8d6b7d688814",
  "created_at": "2024-04-20T12:47:11.186Z",
  "updated_at": "2024-04-20T12:47:11.570Z",
  "local_created_at": null,
  "local_modified_at": null
}

大佬你有申请阿里云盘的开发者应用吧应该,毕竟你都能调试了。 屏幕截图 2024-05-10 121710 我这里有个进群按钮,不知道你有没有,点击就有个二维码,手机钉钉扫一下就可以了。我也是4月下旬申请的,4月23日成功加入的。不要点击底下那个蓝色的“申请理由请填写手机号”,那个链接点进去是一个申请页面,我记得老早之前申请过也进不去。 大佬你要是能进群和阿里官方面对面交流自然是最好的,语雀他们基本上不看不回复的。

jiongxuan commented 4 months ago

不好意思最近一直特别忙,刚看到。

@potoo0 @ypq123456789 麻烦问下,这个问题现在解决了吗?如果阿里云仍有问题的话,我想办法不走客服渠道,反馈给他们试试。

大佬我把你在阿里云盘openapi文档下面的提问发到阿里云盘开发者钉钉群里询问了,有个人这么回复的,你看看是这样的吗

@ypq123456789

不是的,我那里的文件创建时设置了,只不过过程评论放在了《文件上传》页面,没有放在《获取文件列表》页面,我刚补充评论链接了。

另外你怎么进开发群的?我四月底提交了申请和意见,但现在没有任何批准或回复。

为方便查阅这里也把评论内容复制过来。

文件上传

  • /adrive/v1.0/openFile/create 接口 local_created_at/local_modified_at 但是在完成之前都是 null
  • /adrive/v1.0/openFile/complete 接口 local_created_at/local_modified_at,此值就是文件的时间,而不是接口时间
  • /adrive/v1.0/openFile/list 接口 local_created_at/local_modified_at 的值也是 null???

测试脚本:

token='xx'

create_data='{
    "drive_id": "xx",
    "parent_file_id": "xx",
    "name": "ws1.txt",
    "type": "file",
    "check_name_mode": "ignore",
    "local_modified_at": "2024-04-20T12:00:01.000Z",
    "local_created_at": "2024-04-20T12:10:02.000Z"
}'

# 1. create
create_resp=$(curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/create' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$create_data")
echo "create_resp=$create_resp"

# 2. get upload url
# get_upload_req=$(jq -n \
#     --arg drive_id $(jq -r '.drive_id' <<< $create_data) \
#     --arg file_id $(jq -r '.file_id' <<< $create_resp) \
#     --arg upload_id $(jq -r '.upload_id' <<< $create_resp) \
#     --argjson part_info_list '[{"part_number": 1}]' \
#     '$ARGS.named')
# echo "get_upload_req=$get_upload_req"
# get_upload_resp=$(curl --location --request POST \
#     'https://open.aliyundrive.com/adrive/v1.0/openFile/getUploadUrl' \
#     --header "Authorization: Bearer $token" \
#     --header 'Content-Type: application/json' \
#     --data-raw "$get_upload_req")
# echo "get_upload_resp=$get_upload_resp"

# 3. upload
# upload_url=$(jq -r '.part_info_list[0].upload_url' <<< $get_upload_resp)
# upload_url=$(jq -r '.part_info_list[0].upload_url' <<< $create_resp)
# echo "upload_url=$upload_url"
# curl --location --request PUT \
#     "$upload_url" \
#     --data-binary /tmp/test_modtime.txt

# 4. complete
complete_req=$(jq -n \
    --arg drive_id $(jq -r '.drive_id' <<< $create_data) \
    --arg file_id $(jq -r '.file_id' <<< $create_resp) \
    --arg upload_id $(jq -r '.upload_id' <<< $create_resp) \
    '$ARGS.named')
curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/complete' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$complete_req"

获取文件列表

local_created_at/local_modified_at 永远为 null

测试脚本:

token='xx'

list_req='{
    "drive_id": "xx",
    "parent_file_id": "xx"
}'

list_resq=$(curl --location --request POST \
    'https://open.aliyundrive.com/adrive/v1.0/openFile/list' \
    --header "Authorization: Bearer $token" \
    --header 'Content-Type: application/json' \
    --data-raw "$list_req")
jq '.items[] | {name,file_id,created_at,updated_at,local_created_at,local_modified_at}' <<< $list_resq

输出:

{
  "name": "ws1.txt",
  "file_id": "6623bbd678bf7176300543669e7395d3ba0d93cf",
  "created_at": "2024-04-20T12:57:58.870Z",
  "updated_at": "2024-04-20T12:57:59.179Z",
  "local_created_at": null,
  "local_modified_at": null
}
{
  "name": "ws2.txt",
  "file_id": "6623b94f9ff3add28a4a40fa9bfe8d6b7d688814",
  "created_at": "2024-04-20T12:47:11.186Z",
  "updated_at": "2024-04-20T12:47:11.570Z",
  "local_created_at": null,
  "local_modified_at": null
}
potoo0 commented 4 months ago

不好意思最近一直特别忙,刚看到。

@potoo0 @ypq123456789 麻烦问下,这个问题现在解决了吗?如果阿里云仍有问题的话,我想办法不走客服渠道,反馈给他们试试。 ...

@jiongxuan 没有解决。 (我进了钉钉群,但是没人做,我也没时间和精力追着)

jiongxuan commented 4 months ago

@potoo0 好的。“没人做”是指 他们没人回复?还是他们已确认问题,但没有修复?还是说已经有可以 Alist 适配的办法,但是您没有时间搞?

不好意思最近一直特别忙,刚看到。 @potoo0 @ypq123456789 麻烦问下,这个问题现在解决了吗?如果阿里云仍有问题的话,我想办法不走客服渠道,反馈给他们试试。 ...

@jiongxuan 没有解决。 (我进了钉钉群,但是没人做,我也没时间和精力追着)

potoo0 commented 4 months ago

@potoo0 好的。“没人做”是指 他们没人修复/没人回复?还是说他们已经有可以解决的办法,但是您没有时间搞?

不好意思最近一直特别忙,刚看到。 @potoo0 @ypq123456789 麻烦问下,这个问题现在解决了吗?如果阿里云仍有问题的话,我想办法不走客服渠道,反馈给他们试试。 ...

@jiongxuan 没有解决。 (我进了钉钉群,但是没人做,我也没时间和精力追着)

@jiongxuan 群里有人在没有看测试脚本的情况下回复过一次,以为我没有传 local_xxx_at,然后我回复让他看测试过程后再讨论,此后我关注群消息的半个月内一直没任何回应,再测试发现问题依旧,个人猜测没修复。

这个问题必须网盘方提供这个时间的读写,阿里云盘目前情况是只能写没有读 (他们 api 有这个字段但是没有值),alist 不可能绕过阿里云盘来修复的。

jiongxuan commented 4 months ago

@potoo0 好的。我上个月已和云盘同学反馈,他们还是非常重视的。

已收到官方回复,会在近期上线。届时辛苦再测试看下效果。 :)

@potoo0 @ypq123456789 @mo-han @huoxingdawang 请知晓

@potoo0 好的。“没人做”是指 他们没人修复/没人回复?还是说他们已经有可以解决的办法,但是您没有时间搞?

不好意思最近一直特别忙,刚看到。 @potoo0 @ypq123456789 麻烦问下,这个问题现在解决了吗?如果阿里云仍有问题的话,我想办法不走客服渠道,反馈给他们试试。 ...

@jiongxuan 没有解决。 (我进了钉钉群,但是没人做,我也没时间和精力追着)

@jiongxuan 群里有人在没有看测试脚本的情况下回复过一次,以为我没有传 local_xxx_at,然后我回复让他看测试过程后再讨论,此后我关注群消息的半个月内一直没任何回应,再测试发现问题依旧,个人猜测没修复。

这个问题必须网盘方提供这个时间的读写,阿里云盘目前情况是只能写没有读 (他们 api 有这个字段但是没有值),alist 不可能绕过阿里云盘来修复的。

potoo0 commented 4 months ago

@jiongxuan 有具体上线时间吗?我好及时在 alist 对接

gdtv commented 3 months ago

我也遇到这个问题。 我用alist挂载网盘主要用途是备份,丢失文件修改时间等元数据让所有的同步备份软件失效,无法实现差异备份。 阿里云盘、天翼云盘、百度网盘试过都不行。 Windows下RaiDrive、RClone挂载都不行。

好像大部分普通网盘都不支持保留文件修改时间,至少我用过的国内多家网盘都不支持。只有阿里云oss,aws s3这些专业的对象存储支持。 如果一定要用普通网盘来备份,有一些解决方案: 1、使用类似restic(推荐)、duplicati(不推荐,因为同一个文件夹里的备份文件数量可能会超过网盘限制)等这些分片存储的备份app 2、用juicefs将网盘弄成一个虚拟的文件系统(不推荐,分片的文件太小,小文件上传太慢) 3、用rclone命令行备份的时候使用参数 --size-only 只对比文件的修改时间(不推荐,因为一是只对比时间不准确,二是单个文件大小可能超过网盘限制)

mo-han commented 3 months ago

1、使用类似restic(推荐)、duplicati(不推荐,因为同一个文件夹里的备份文件数量可能会超过网盘限制)等这些分片存储的备份app 2、用juicefs将网盘弄成一个虚拟的文件系统(不推荐,分片的文件太小,小文件上传太慢) 3、用rclone命令行备份的时候使用参数 --size-only 只对比文件的修改时间(不推荐,因为一是只对比时间不准确,二是单个文件大小可能超过网盘限制)

我在百度网盘挂载中使用KopiaUI,还多套了一层crypt。目前存储量1TB了,用着还可以。它的切片存储目录有两级,每一级都是三位名称,每一位是16进制字符。最后同目录下的文件数量极少,往往只有一两个,但目录数量比较多,目前每一级目录数量都有700多,不知道会不会超过限制。

gdtv commented 3 months ago

1、使用类似restic(推荐)、duplicati(不推荐,因为同一个文件夹里的备份文件数量可能会超过网盘限制)等这些分片存储的备份app 2、用juicefs将网盘弄成一个虚拟的文件系统(不推荐,分片的文件太小,小文件上传太慢) 3、用rclone命令行备份的时候使用参数 --size-only 只对比文件的修改时间(不推荐,因为一是只对比时间不准确,二是单个文件大小可能超过网盘限制)

我在百度网盘挂载中使用KopiaUI,还多套了一层crypt。目前存储量1TB了,用着还可以。它的切片存储目录有两级,每一级都是三位名称,每一位是16进制字符。最后同目录下的文件数量极少,往往只有一两个,但目录数量比较多,目前每一级目录数量都有700多,不知道会不会超过限制。

对,Kopia可以的,700多文件夹应该没问题。restic是256个文件夹,只有一层,每个分片文件最大是128MB,假如每个文件夹放1000个文件,最大可以存储32TB,足够了。

jiongxuan commented 3 months ago

@potoo0 和相关负责人沟通确认,已上线!新增 local_created_at 和 local_modified_at

可参考文档:https://www.yuque.com/aliyundrive/zpfszx/ezlzok

@jiongxuan 有具体上线时间吗?我好及时在 alist 对接

potoo0 commented 3 months ago

@potoo0 和相关负责人沟通确认,已上线!新增 local_created_at 和 local_modified_at

@jiongxuan 好的,我明天看看

potoo0 commented 3 months ago

@potoo0 和相关负责人沟通确认,已上线!新增 local_created_at 和 local_modified_at

@jiongxuan 已测试,对此问题来说没变化。 原问题一句话总结就是:上传文件 api 能返回 local_created/modified_at, 但是文件列表 api 没有。

api 测试:

# wsl @ mf780 in ~/test_cmtime [15:11:07]
$ ./ali_put.sh

create_resp=
{
    ...
    "file_id": "66d2c20cffbf5982b2604f0ca2d5dc1c19f26184",
    "file_extension": null,
    "revision_id": "66d2c20c2056a28013cf4a40a647c8a5b552c891",
    "file_name": "ws1.txt",
    "upload_id": "5C60ED6C226E4A1BB182ED35511D49EC",
    ...
}

complete_resp=
{
    "name": "ws1.txt",
    "type": "file",
    "category": "doc",
    "hidden": false,
    "status": "available",
    "file_id": "66d2c20cffbf5982b2604f0ca2d5dc1c19f26184",
    "file_extension": "txt",
    "revision_id": "66d2c20c2056a28013cf4a40a647c8a5b552c891",
    "content_hash": "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709",
    "content_hash_name": "sha1",
    "encrypt_mode": "none",
    "domain_id": "bj29",
    "download_url": null,
    "user_meta": null,
    "content_type": "application/oct-stream",
    "created_at": "2024-08-31T07:11:08.641Z",
    "updated_at": "2024-08-31T07:11:08.958Z",
    "local_created_at": "2024-04-20T12:10:02.000Z",
    "local_modified_at": "2024-04-20T12:00:01.000Z",
    ...
}

# wsl @ mf780 in ~/test_cmtime [15:11:09]
$ ./ali_list.sh
{
  "name": "ws1.txt",
  "file_id": "66d2c20cffbf5982b2604f0ca2d5dc1c19f26184",
  "created_at": "2024-08-31T07:11:08.641Z",
  "updated_at": "2024-08-31T07:11:08.958Z",
  "local_created_at": null,
  "local_modified_at": null
}
jiongxuan commented 3 months ago

@potoo0 好的。我跟官方同学再反馈下。他们意思是 file/get file/list 都会加,目前正在 Check

@potoo0 和相关负责人沟通确认,已上线!新增 local_created_at 和 local_modified_at

@jiongxuan 已测试,对此问题来说没变化。 原问题一句话总结就是:上传文件 api 能返回 local_created/modified_at, 但是文件列表 api 没有。

api 测试:

# wsl @ mf780 in ~/test_cmtime [15:11:07]
$ ./ali_put.sh

create_resp=
{
    ...
    "file_id": "66d2c20cffbf5982b2604f0ca2d5dc1c19f26184",
    "file_extension": null,
    "revision_id": "66d2c20c2056a28013cf4a40a647c8a5b552c891",
    "file_name": "ws1.txt",
    "upload_id": "5C60ED6C226E4A1BB182ED35511D49EC",
    ...
}

complete_resp=
{
    "name": "ws1.txt",
    "type": "file",
    "category": "doc",
    "hidden": false,
    "status": "available",
    "file_id": "66d2c20cffbf5982b2604f0ca2d5dc1c19f26184",
    "file_extension": "txt",
    "revision_id": "66d2c20c2056a28013cf4a40a647c8a5b552c891",
    "content_hash": "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709",
    "content_hash_name": "sha1",
    "encrypt_mode": "none",
    "domain_id": "bj29",
    "download_url": null,
    "user_meta": null,
    "content_type": "application/oct-stream",
    "created_at": "2024-08-31T07:11:08.641Z",
    "updated_at": "2024-08-31T07:11:08.958Z",
    "local_created_at": "2024-04-20T12:10:02.000Z",
    "local_modified_at": "2024-04-20T12:00:01.000Z",
    ...
}

# wsl @ mf780 in ~/test_cmtime [15:11:09]
$ ./ali_list.sh
{
  "name": "ws1.txt",
  "file_id": "66d2c20cffbf5982b2604f0ca2d5dc1c19f26184",
  "created_at": "2024-08-31T07:11:08.641Z",
  "updated_at": "2024-08-31T07:11:08.958Z",
  "local_created_at": null,
  "local_modified_at": null
}