
使用 http head 请求可避免下载文件内容,仅检查服务器响应状态码,从而高效判断远程文件是否存在,特别适用于大文件场景。
使用 http head 请求可避免下载文件内容,仅检查服务器响应状态码,从而高效判断远程文件是否存在,特别适用于大文件场景。
在 Go 中检测远程 Web 文件(如 http://aa.com/aa.mp4)是否存在时,若直接使用 http.Get(),客户端会完整接收响应体——对大型视频、压缩包等资源而言,这不仅浪费带宽和内存,还显著增加延迟与超时风险。
更优方案是采用 HTTP HEAD 请求:它与 GET 语义一致,但服务器禁止返回响应体(依据 RFC 7231 §4.3.2),仅返回状态码与头部信息。Go 标准库通过 http.Head() 提供简洁封装:
func fileExists(url string) bool {
resp, err := http.Head(url)
if err != nil {
return false // 网络错误、DNS 失败、连接超时等
}
defer resp.Body.Close() // 即使无 body,仍需关闭以释放底层连接
return resp.StatusCode == http.StatusOK
}
⚠️ 注意事项:
-
务必调用
resp.Body.Close():即使 HEAD 响应无 body,不关闭会导致连接泄漏,影响后续请求复用(HTTP/1.1 keep-alive); -
状态码非 200 不代表文件绝对不存在:
403 Forbidden(权限不足)、405 Method Not Allowed(服务器禁用 HEAD)、429 Too Many Requests等均可能被误判为“不存在”,生产环境建议结合日志与重试策略; -
超时控制:显式设置
http.Client超时,防止阻塞:client := &http.Client{ Timeout: 10 * time.Second, } resp, err := client.Head(url)
总结:HEAD 是轻量、标准且高效的文件存在性探测方式。相比 GET,它零传输负载、低延迟、高并发友好,是 Web 资源探活的首选实践。










