先确认中断前下载的是哪一个文件

  1. 从发布者的正式下载页确认版本、架构、文件名、大小和校验信息。优先使用固定版本地址,避免把会变化的 latest 链接当作同一对象。
  2. 停止其他正在写入该文件的下载任务,并给已有残片留一份备份。检查剩余磁盘空间和写入权限;续传不能解决磁盘已满。
  3. 如果下载需要登录、短时签名或应用专用协议,优先回到官方客户端恢复。不要为复制请求把 Cookie 或授权头贴进公开命令。

续传只是请求缺少的字节,不会自动证明已有字节来自正确版本。无法确定残片来源,或发布者替换过文件时,保留残片作记录,换一个新文件名从头下载。文件名相同、大小相近都不足以认定内容一致。

新的下载先固定输出文件与超时

macOS / Linux;在专用下载目录执行,无需管理员权限
curl -q --location --fail --connect-timeout 15 --max-time 1800 --dump-header first-headers.txt --output package.part "https://example.com/replace-with-fixed-version-file"

Windows 将开头的 curl 换成 curl.exe,整行执行即可。URL 是占位值,package.part、first-headers.txt 是本地示例文件,会写入当前目录;首次命令可能覆盖同名文件,只在输出文件不存在时使用。--max-time 1800 是本例的 30 分钟上限,可按文件大小调整,超时留下残片不代表文件损坏。

-q 跳过默认 curl 配置,但不清除代理环境变量。需要本地 HTTP 代理时,可在命令中明确加入 --proxy http://127.0.0.1:7890;7890 必须换成客户端实际 HTTP/mixed 监听端口,且要核对 NO_PROXY 是否让目标绕过代理。不要为续传关闭证书验证。响应头文件可能含 Cookie 或跳转令牌,仅保存在本地。

恢复时使用同一文件,先确认远端没有变化

macOS / Linux;Windows 使用 curl.exe;会向已确认的同一残片续写
curl -q --location --fail --connect-timeout 15 --max-time 1800 --continue-at - --dump-header resume-headers.txt --output package.part "https://example.com/replace-with-fixed-version-file"

--continue-at - 按本地输出文件大小确定偏移,不需要手工猜数字。运行前比较发布者的版本与校验信息;若之前保存过 ETag 或 Last-Modified,也可用来发现资源变化,但不能仅凭一个时间字段保证字节相同。不要把 -C 与 --range 叠加,也不要手工用追加重定向把新的完整响应拼到旧文件后面。

实际结果处理方式
206,Content-Range 与残片偏移相符表示接受了范围请求;继续等待结束并核验文件
返回 200 全量正文,或提示不支持续传停止拼接尝试,换新文件名完整下载
416 范围不满足核对是否已完整或远端已变化,不能只凭该状态宣布完成
401 / 403 或链接失效回正式入口确认权限或取得新地址,再确认是否同一对象
超时或连接中断保留残片与错误,先处理网络或存储问题再重试

查看 resume-headers.txt 时注意重定向可能留下多组响应头,应看最终文件响应。--fail 能识别许多 HTTP 错误,但返回 200 的登录页仍可能被当作文件保存。Accept-Ranges、下载进度和退出状态都不能代替最终内容核验。

完成后验证,再清理临时文件

  1. 确认命令正常结束,再使用系统或可信工具计算完整文件的校验值,与发布者公布的对应算法和版本逐字比较;有签名时按发布者说明验证。
  2. 同时核对最终大小与格式。仅有大小一致或能解压,不等同于来源和完整性已经得到可靠确认。
  3. 校验通过后再改为正式文件名并使用。校验失败就隔离该文件,换新输出文件从头下载,不在旧残片上反复覆盖试错。

不支持续传时,选择稳定网络在可接受时间内完整下载,或使用发布者提供的镜像和官方客户端。本文不设置永久代理变量;测试后结束残留下载进程,确认不再需要后清理响应头及备份。没有官方校验或签名时,应注明完整性保证有限,不把下载结束写成已验证安全。