http.Get 下载文件返回空或404的主因是服务端拒非浏览器请求、URL不完整(如缺https://)或重定向异常;大文件需用io.Copy流式写入磁盘;受保护链接须用http.Client+Request带Header/Cookie;续传需手动处理Range请求与文件偏移。

Go 中用 http.Get 下载文件时为什么返回空或 404?
常见原因是服务端拒绝非浏览器请求,或 URL 拼写错误(比如漏了 https://),也可能是重定向没自动跟随。默认 http.Get 会自动处理 3xx 重定向,但某些 CDN 或鉴权接口会返回 302 却不带 Location 头,导致 resp.Body 为空。
- 先检查
resp.StatusCode是否为 200,不是就打印resp.Status和resp.Header - 若需手动控制重定向,用
http.Client配置CheckRedirect字段 - URL 必须完整,
http.Get("example.com/file.zip")会失败,应写成http.Get("https://example.com/file.zip")
下载大文件时内存爆掉,怎么边下边写入磁盘?
直接用 ioutil.ReadAll(resp.Body) 或 bytes.Buffer 会把整个响应体加载进内存,几 GB 的文件必然 OOM。正确做法是用 io.Copy 流式写入文件句柄。
- 用
os.Create打开目标文件,得到*os.File - 用
io.Copy(dst, resp.Body),底层按 32KB 分块读写,内存占用恒定 - 务必在
defer file.Close()前检查io.Copy返回的 error,否则可能写入不全却无报错
file, _ := os.Create("data.zip")
defer file.Close()
_, err := io.Copy(file, resp.Body)
if err != nil {
log.Fatal(err) // 不要忽略这个 err
}
如何带 Cookie 或 Token 请求受保护的下载链接?
很多下载接口需要登录态,http.Get 无法传 Header,必须用 http.Client + http.NewRequest。
一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!
- 创建
req, _ := http.NewRequest("GET", url, nil) - 设置 Header:
req.Header.Set("Authorization", "Bearer xxx")或req.AddCookie(&http.Cookie{Name: "sessionid", Value: "abc123"}) - 用
client.Do(req)发起请求,client可复用,避免连接泄漏 - 注意 Cookie 域名和路径是否匹配,否则服务端不认
下载中断后怎么续传?Range 请求怎么写?
服务端需支持 Accept-Ranges: bytes,客户端才能发 Range: bytes=1000- 请求剩余部分。Go 标准库不自动续传,得自己处理文件偏移和 Header。
立即学习“go语言免费学习笔记(深入)”;
- 先
os.Stat获取已下载文件大小,设为start - 构造请求头:
req.Header.Set("Range", fmt.Sprintf("bytes=%d-", start)) - 用
os.OpenFile(..., os.O_WRONLY|os.O_APPEND)打开文件,确保写入位置正确 - 注意:206 Partial Content 响应体不含全部文件,
Content-Length是本次传输长度,不是原文件大小
Content-Disposition 文件名含非法字符导致 os.Create 失败。这些都得在 resp.StatusCode == 200 后再做二次校验。









