grep ATTACH = 0,LocalEvent 无 attachments 字段。日程与待办都没有附件能力。
grep ATTACH
LocalEvent
attachments
IcsUtil
ATTACH
ATTACH;FMTTYPE=...:<url>
PUT
CalDAV 附件依赖服务器支持。 群晖的 CalDAV 实现未必支持 ATTACH 的 托管上传(RFC 8607 的 managed attachments 是较新扩展)。 需先探测服务器能力:PROPFIND 查 supported-report-set / 直接用 ATTACH 存外部 URL(HTTP 链接)——后者最稳妥。
PROPFIND
supported-report-set
先做"外部链接附件"(ATTACH 存 URL,不托管文件), 风险低、能覆盖"贴个资料链接"的主要场景。 托管上传留待确认服务器支持后再做。
.ics
ATTACH:<url>
附件是 ATTACH 协议能力,与子任务、提醒、字段扩展均无重叠
用户明确:不做"自己传文件贴链接"的方案,只要协议支持就按标准协议实现。
iCalendar RFC 5545 原生支持附件:ATTACH 是核心属性,明确可用于 VTODO。 两种形式:URI(外部链接)和内联 base64(ATTACH;FMTTYPE=...;ENCODING=BASE64;VALUE=BINARY:<base64>)。 内联 base64 就是 .ics 文本的一部分,任何符合 RFC 5545 的服务器都能存,不需要服务器特殊能力。
ATTACH;FMTTYPE=...;ENCODING=BASE64;VALUE=BINARY:<base64>
RFC 8607 托管附件(calendar-managed-attachments)是另一层扩展,需要服务器显式支持。 之前探测到的"不支持"是这层,群晖没有。
calendar-managed-attachments
ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:<base64>
内联 base64 会让 .ics 变大,且每次改写该待办都要重传全部附件数据 (这正是 RFC 8607 要解决的痛点,但我们服务器不支持 8607,只能接受)。 对策:附件数量/大小做了合理限制后,代价可控。
提交:d9db8b4
d9db8b4
按用户决策,走标准协议内联 base64(非托管上传、非外部链接)。
实测群晖:
ATTACH;FMTTYPE=...;ENCODING=BASE64;VALUE=BINARY:<b64>
rewriteTodoFields
最多 3 个附件、单文件 ≤5MB(内联 base64 膨胀,限制防爆)。
真机文件选择器上传未验(设备离线)。需人工验:选文件→保存→另一客户端看到附件。
设备连上后补做了本批(#43 #44 #45)的真机验证。
服务器写入一条「今天 DUE」的待办后:
待办 0 条
待办 1 条
[144,1398][1004,1442] 今天截止验证
待办完成成功 id=750
0 条
待办区是否还在: False
服务器写入父任务 + 子任务(RELATED-TO)后:
个人成长待办:REPORT 4 个资源,解析 4 条
[202,796][437,851] 父任务验证
无截止时间 · 群晖:个人成长 · 0/1
[277,985][571,1040] ∟ 子任务验证
∟
待办完成成功 id=751
id=752
级联完成 1 个子任务(父 verify43-parent)
filePicker/FileMgr
测试数据已全部删除(verify45-today-todo / verify43-parent / verify43-child,均 204)。
No dependencies set.
The note is not visible to the blocked user.
现状
grep ATTACH= 0,LocalEvent无attachments字段。日程与待办都没有附件能力。需要做的事
attachments(TEXT,存 JSON 数组)IcsUtil读写ATTACH(URI 形式ATTACH;FMTTYPE=...:<url>)PUT到集合的资源路径,或走外部链接 URI)关键风险 ⚠️
CalDAV 附件依赖服务器支持。 群晖的 CalDAV 实现未必支持
ATTACH的托管上传(RFC 8607 的 managed attachments 是较新扩展)。
需先探测服务器能力:
PROPFIND查supported-report-set/直接用
ATTACH存外部 URL(HTTP 链接)——后者最稳妥。建议方案
先做"外部链接附件"(ATTACH 存 URL,不托管文件),
风险低、能覆盖"贴个资料链接"的主要场景。
托管上传留待确认服务器支持后再做。
验收标准
.ics里出现ATTACH:<url>为什么单独建单
附件是 ATTACH 协议能力,与子任务、提醒、字段扩展均无重叠
方案变更:改为「内联 base64」标准实现(2026-11-04 用户决策 + 实测)
用户明确:不做"自己传文件贴链接"的方案,只要协议支持就按标准协议实现。
查证结论(分层)
iCalendar RFC 5545 原生支持附件:
ATTACH是核心属性,明确可用于 VTODO。两种形式:URI(外部链接)和内联 base64(
ATTACH;FMTTYPE=...;ENCODING=BASE64;VALUE=BINARY:<base64>)。内联 base64 就是 .ics 文本的一部分,任何符合 RFC 5545 的服务器都能存,不需要服务器特殊能力。
RFC 8607 托管附件(
calendar-managed-attachments)是另一层扩展,需要服务器显式支持。之前探测到的"不支持"是这层,群晖没有。
实测(群晖 synccalendartest)
ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:<base64>的待办 → 201实现方案(按标准协议)
ATTACH行,内联 base64 编码,随 .ics 一起 PUT/同步固有代价(需知悉)
内联 base64 会让 .ics 变大,且每次改写该待办都要重传全部附件数据
(这正是 RFC 8607 要解决的痛点,但我们服务器不支持 8607,只能接受)。
对策:附件数量/大小做了合理限制后,代价可控。
验收记录
提交:
d9db8b4方案确认 + 实测
按用户决策,走标准协议内联 base64(非托管上传、非外部链接)。
实测群晖:
ATTACH;FMTTYPE=...;ENCODING=BASE64;VALUE=BINARY:<b64>→ 201改了什么
ATTACH内联 base64 读写(IcsUtil attachLine/parseTodos)attachmentsJSON([{name,mime,base64}])rewriteTodoFieldstouchAttach 哨兵:不编辑附件时保留服务器原值限制
最多 3 个附件、单文件 ≤5MB(内联 base64 膨胀,限制防爆)。
遗留
真机文件选择器上传未验(设备离线)。需人工验:选文件→保存→另一客户端看到附件。
真机验证结果(2026-11-04 19:00,设备 5NC0225B27004718)
设备连上后补做了本批(#43 #44 #45)的真机验证。
#45 待办投射到日历 —— ✅ 全部通过
服务器写入一条「今天 DUE」的待办后:
待办 0 条→待办 1 条(同步后正确识别)[144,1398][1004,1442] 今天截止验证待办完成成功 id=750待办 1 条→0 条,界面消失待办区是否还在: False)#43 子任务 —— ✅ 全部通过
服务器写入父任务 + 子任务(RELATED-TO)后:
个人成长待办:REPORT 4 个资源,解析 4 条[202,796][437,851] 父任务验证无截止时间 · 群晖:个人成长 · 0/1[277,985][571,1040] ∟ 子任务验证(x 从 202→277,缩进 75px)∟正确显示待办完成成功 id=751+id=752+级联完成 1 个子任务(父 verify43-parent)#44 附件 —— ⚠️ 部分通过
filePicker/FileMgr记录,选择器正常打开清理
测试数据已全部删除(verify45-today-todo / verify43-parent / verify43-child,均 204)。