首先实现文件上传与下载功能,通过net/http解析multipart表单获取文件并保存;其次设置响应头触发浏览器下载,防止路径穿越;最后通过限制大小、校验类型、使用随机命名等措施保障安全。

实现文件上传与下载功能在Golang中非常常见,尤其在构建Web服务时。通过标准库
net/http和
os等,可以轻松完成这些操作。下面介绍如何实现一个简洁、安全、可扩展的文件上传与下载服务。
文件上传处理
文件上传的核心是解析HTTP请求中的multipart/form-data数据,提取上传的文件并保存到服务器指定目录。
关键步骤包括:
- 使用
http.Request
的ParseMultipartForm
方法解析请求体 - 通过
FormFile
获取上传的文件句柄 - 使用
os.Create
创建目标文件,并用io.Copy
将上传内容写入磁盘 - 设置合理的内存和磁盘大小限制,防止恶意大文件攻击
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "仅支持POST请求", http.StatusMethodNotAllowed)
return
}
// 解析multipart表单,最大内存10MB
r.ParseMultipartForm(10 << 20)
file, handler, err := r.FormFile("file")
if err != nil {
http.Error(w, "无法获取上传文件", http.StatusBadRequest)
return
}
defer file.Close()
// 创建保存文件
dst, err := os.Create("./uploads/" + handler.Filename)
if err != nil {
http.Error(w, "无法创建文件", http.StatusInternalServerError)
return
}
defer dst.Close()
// 复制文件内容
io.Copy(dst, file)
fmt.Fprintf(w, "文件 %s 上传成功", handler.Filename)
}
文件下载实现
文件下载的关键是设置正确的响应头,让浏览器触发下载行为,而不是直接显示内容。
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
立即学习“go语言免费学习笔记(深入)”;
主要操作包括:
- 验证请求的文件名,防止路径穿越攻击(如 ../../etc/passwd)
- 使用
os.Open
打开文件 - 设置
Content-Disposition
头为attachment模式 - 设置
Content-Type
为application/octet-stream
以强制下载 - 使用
http.ServeContent
安全地发送文件流
func downloadHandler(w http.ResponseWriter, r *http.Request) {
filename := r.URL.Query().Get("file")
if filename == "" {
http.Error(w, "缺少文件名参数", http.StatusBadRequest)
return
}
// 简单路径安全检查
if strings.Contains(filename, "..") || strings.Contains(filename, "/") {
http.Error(w, "非法文件名", http.StatusBadRequest)
return
}
path := "./uploads/" + filename
file, err := os.Open(path)
if err != nil {
http.Error(w, "文件不存在", http.StatusNotFound)
return
}
defer file.Close()
// 设置响应头
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
w.Header().Set("Content-Type", "application/octet-stream")
http.ServeContent(w, r, filename, time.Now(), file)
}
安全与优化建议
在生产环境中,需额外考虑安全性与性能:
- 限制上传文件大小,避免资源耗尽
- 校验文件类型(如通过magic number),防止恶意文件上传
- 使用随机文件名或哈希命名,避免覆盖和信息泄露
- 对上传目录做权限控制,禁止执行权限
- 考虑使用临时目录和异步处理提升响应速度









