Nextcloud 打包下载:3 步出 ZIP,版本与临时空间一起瘦身
【免费下载链接】server☁️ Nextcloud server, a safe home for all your data项目地址: https://gitcode.com/GitHub_Trending/se/server
把一份 200 多文件的资料夹发给同事,靠共享链接打包下载,浏览器进度条却停在 99%。先看下面这条最短路径,再弄明白服务端到底怎么打这个包。
最快路径:网页端 3 步打包下载
- 登录网页版,进入文件页面,打开目标文件夹。
- 按住 Ctrl(Mac 用 Command)勾选多个文件,点顶部工具栏"下载"按钮。
- 浏览器弹出以文件夹命名的
.zip文件,下载约与文件大小成正比,无需等待服务端预处理。
第二条入口:文件夹右侧"..."里选"共享",开启"允许下载"后,把链接发给对方;对方打开链接页点"下载",同样直接出 ZIP。
底层在做什么:服务端边传边压,不落盘
请求里带上accept=zip后,DAV 服务不会先生成临时压缩包,而是用流式方式把文件夹逐个节点写进 ZIP 边压缩边发送,服务器磁盘几乎不额外占用,速度瓶颈只在网络带宽。核心就这几行:
$zipRequest = !empty(array_intersect(['application/zip', 'zip'], $accept)); if (!$zipRequest && !$tarRequest) { return null; } $streamer = new Streamer($tarRequest, -1, count($content), $this->timezoneFactory); $streamer->finalize();判断逻辑在apps/dav/lib/Connector/Sabre/ZipFolderPlugin.php,实际写入由lib/private/Streamer.php完成。共享页的"下载"按钮最终也只是把请求重定向到/public.php/dav/files/<token>/?accept=zip这个端点(见apps/files_sharing/lib/Controller/ShareController.php)。
调优与进阶:按文件挑、按体积选格式、按保留策略瘦身
只挑部分文件打包
整夹太大时用files参数传 JSON 数组,或加X-NC-Files请求头,只挑需要的文件进包。适合挑 3~5 个文件给外部人员,包体从几十 GB 降到几百 MB。
超 4GB 或文件超 65535 个时自动换格式
Streamer 检测到总大小超过 4GB、或条目数超过 65535 时会自动切到 ZIP64,老版本解压软件可能打不开。预期效果:换 7-Zip 或 Bandizip 解压,或提前把文件夹拆成两份再分别下载。
版本历史吃磁盘时收紧保留策略
config.php里把versions_retention_obligation从auto改成daily、weekly等固定周期,旧版本只在周期边界保留,能明显压低历史版本占用。管理员面板"文件版本"里还能限制历史版本占磁盘上限,配合使用。
踩坑提醒:卡 99%、404、507 各有解法
- 下载卡在 99% 不动:流式打包中途某个文件读取出错(权限或外部存储掉线),服务端整包中断。缩小文件集合重试,或让对方单独下载那几个文件。
- 解压软件提示 ZIP 损坏:包超过 4GB 已自动切 ZIP64,老工具不支持。换 7-Zip 打开,或拆夹后重新打包下载。
- 共享链接点下载返回 404:共享设置里"允许下载"被关掉了,或链接已过期。让共享者重新勾选下载权限,或换用新链接。
- 大文件夹下载反复超时断开:Web 服务器(nginx 等)超时时间不够长,流式传输中途被掐。改用 curl 或浏览器重试续传,或分文件夹打包。
- 服务器磁盘越来越满:旧版本和共享残留没清。收紧
versions_retention_obligation,并用管理员面板的文件版本清理按钮批量删除过期版本。
- README.md
- apps/files_sharing/lib/Controller/ShareController.php
- apps/dav/lib/Connector/Sabre/ZipFolderPlugin.php
- lib/private/Streamer.php
【免费下载链接】server☁️ Nextcloud server, a safe home for all your data项目地址: https://gitcode.com/GitHub_Trending/se/server
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考