Golang如何实现文件下载_Golang Web文件下载示例-Golang

HTTP响应头需设Content-Disposition为attachment模式并正确编码中文文件名,配合适当Content-Type;大文件须流式传输并校验路径、处理Range请求;实际路由中须补全路径净化、错误检查、超时控制等安全细节。

HTTP响应头必须设置Content-Disposition

不设这个头,浏览器会尝试渲染文件(比如PDF、JSON),而不是下载。关键是要用attachment模式,并正确编码中文文件名:

  • w.Header().Set("Content-Disposition", "attachment; filename=\""+filename+"\"") —— 仅适用于ASCII文件名
  • 中文名需用filename*=UTF-8''格式,例如:w.Header().Set("Content-Disposition", "attachment; filename*=UTF-8''"+url.PathEscape(filename))
  • 别漏掉Content-Type,用http.DetectContentType或根据扩展名查表更稳妥,避免硬写"application/octet-stream"导致移动端无法识别

文件读取不能直接 ioutil.ReadFile

大文件(>10MB)用ioutil.ReadFile会吃光内存,应流式传输:

  • 用os.Open打开文件,再调用io.Copy(w, f),让内核负责缓冲
  • 务必在defer f.Close()前检查os.Open错误,否则空指针panic
  • 如果文件路径来自用户输入(如r.URL.Query().Get("file")),必须做路径净化,防止../../../etc/passwd越界访问

支持断点续传要处理Range请求

浏览器下载中断后重试时会发Range: bytes=1000-,服务端不响应会导致重下整个文件:

  • 检查r.Header.Get("Range")是否非空
  • 解析出start偏移,用f.Seek(start, io.SeekStart)
  • 设置206 Partial Content状态码和Content-Range头,例如:bytes 1000-9999/10000
  • 注意:Content-Length此时应为剩余字节数,不是整个文件大小

实际路由示例中容易忽略的细节

以下代码片段看似能跑,但上线后可能出问题:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Golang如何实现文件下载_Golang Web文件下载示例-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4014640+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4014640+
  • 本周更新: 0+
  • 最后更新: 2026-03-16