需用http.NewRequest手动设Range头并处理206响应;通过Accept-Ranges或Content-Range判断服务端是否支持;文件写入须Seek定位而非O_APPEND;并发分片下载应独立文件句柄或用WriteAt加锁。
net/http 发起带 Range 头的 GET 请求Go 标准库本身不自动支持断点续传,但完全可以通过手动设置 Range 请求头 + 处理 206 Partial Content 响应来实现。关键在于:你得自己维护已下载字节数,并在下次请求时填入正确的 Range: bytes=。start-
常见错误是直接复用 http.Get —— 它无法自定义请求
头。必须用 http.NewRequest 构造请求,并显式设置 Range:
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return err
}
req.Header.Set("Range", "bytes=1024-") // 从第1024字节开始下载
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
注意:Range 值末尾不加结束位置(如 bytes=1024-)表示“从该位置到文件末尾”,服务端必须支持这种语法(绝大多数 HTTP 服务器都支持)。
不能只看状态码是否为 206;更可靠的方式是检查响应头中是否存在 Accept-Ranges: bytes 或 Content-Range 字段。如果服务端返回 200 OK 却没这些头,说明它根本不支持分块传输,强行续传会重复下载整个文件。
立即学习“go语言免费学习笔记(深入)”;
实操建议:
Range: bytes=0-0 的试探请求,看响应是否为 206 且含 Content-Range
200 或 416 Range Not Satisfiable,基本可判定不支持或文件太小(0-0 超出范围)Range 头,此时即使源站支持,你也拿不到 206
用 os.OpenFile 以 os.O_WRONLY | os.O_CREATE | os.O_APPEND 模式打开文件是错的 —— O_APPEND 会强制写到文件末尾,无法跳转到指定偏移量。断点续传必须用 os.O_WRONLY | os.O_CREATE 打开,再调用 file.Seek 定位。
示例关键步骤:
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
// 假设已下载 1024 字节,接下来要写入第 1024 字节起的位置
_, err = f.Seek(1024, 0)
if err != nil {
return err
}
io.Copy(f, resp.Body) // 直接写入,无需手动分块
注意:Seek 后必须检查错误;如果文件原本不存在,Seek 会失败,需先创建空文件或改用 os.Truncate 预分配大小(对大文件更友好)。
可以切分 Range(如 0-1023、1024-2047)并发请求,但必须保证每个分片写入对应磁盘偏移,且避免多个 goroutine 同时写同一文件句柄 —— Go 的 *os.File 不是并发安全的。
推荐做法:
*os.File(通过 os.OpenFile(..., os.O_WRONLY) 重新打开),并用 Seek 定位后写入sync.Mutex 保护 WriteAt(注意:不是 Write),因为 WriteAt 是线程安全的Content-Length 判断总大小 —— 分片响应里这个值只是当前块长度;应首次用 HEAD 请求获取 Content-Length 头最易被忽略的一点:HTTP/1.1 连接复用下,多个 Range 请求可能被服务端按顺序响应,但 Go 的 http.Transport 默认限制每 host 最多 2 个并发连接,需显式调大 MaxConnsPerHost 才能真正并发。
# go
# golang
# app
# 字节
# cdn
# 状态码
# 并发请求
# 标准库
# Length
# 线程
# 并发
# http
# 多个
# 句柄
# 分片
# 服务端
# 首次
# 断点续传
# 不支持
# 复用
# 切分
# 最多
相关文章:
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何将凡科建站内容保存为本地文件?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何高效配置IIS服务器搭建网站?
平台云上自助建站如何快速打造专业网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
安云自助建站系统如何快速提升SEO排名?
如何基于云服务器快速搭建网站及云盘系统?
建站之星如何一键生成手机站?
建站主机是什么?如何选择适合的建站主机?
如何用虚拟主机快速搭建网站?详细步骤解析
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
高防服务器租用指南:配置选择与快速部署攻略
临沂网站制作公司有哪些,临沂第四中学官网?
视频网站制作教程,怎么样制作优酷网的小视频?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
网站企业制作流程,用什么语言做企业网站比较好?
大连 网站制作,大连天途有线官网?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
学校建站服务器如何选型才能满足性能需求?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何通过万网虚拟主机快速搭建网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
开封网站制作公司,网络用语开封是什么意思?
外贸公司网站制作哪家好,maersk船公司官网?
宝塔面板创建网站无法访问?如何快速排查修复?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何快速搭建虚拟主机网站?新手必看指南
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在IIS中新建站点并解决端口绑定冲突?
如何访问已购建站主机并解决登录问题?
网站制作话术技巧,网站推广做的好怎么话术?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
网站网页制作专业公司,怎样制作自己的网页?
常州企业建站如何选择最佳模板?
如何在西部数码注册域名并快速搭建网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
建站主机服务器选型指南与性能优化方案解析
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
建站之星备案是否影响网站上线时间?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何通过智能用户系统一键生成高效建站方案?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
ui设计制作网站有哪些,手机UI设计网址吗?
模具网站制作流程,如何找模具客户?
如何选择适合PHP云建站的开源框架?
*请认真填写需求信息,我们会在24小时内与您取得联系。