使用Go标准库net/http实现文件上传,通过ParseMultipartForm解析表单,FormFile获取文件句柄,保存到服务器指定目录,同时支持前端HTML表单提交,完整示例包含错误处理与文件路径安全校验。

实现一个文件上传接口在Go语言中非常直接,利用标准库
net/http就能快速搭建。下面是一个完整的HTTP文件上传接口示例,包含后端处理和简单的前端表单。
1. 后端:Golang HTTP 文件上传处理
使用
http.Request的
ParseMultipartForm方法解析上传的文件,然后通过
request.FormFile获取文件句柄。 示例代码:
package main
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
)
// 上传文件处理函数
func uploadHandler(w http.ResponseWriter, r *http.Request) {
// 只允许 POST 方法
if r.Method != "POST" {
http.Error(w, "只允许 POST 请求", http.StatusMethodNotAllowed)
return
}
// 解析 multipart 表单,最大内存 32MB
err := r.ParseMultipartForm(32 << 20)
if err != nil {
http.Error(w, "解析表单失败", http.StatusBadRequest)
return
}
// 获取上传的文件,字段名为 "file"
file, handler, err := r.FormFile("file")
if err != nil {
http.Error(w, "获取文件失败", http.StatusBadRequest)
return
}
defer file.Close()
// 创建保存文件的目录
uploadDir := "./uploads"
if err := os.MkdirAll(uploadDir, os.ModePerm); err != nil {
http.Error(w, "创建目录失败", http.StatusInternalServerError)
return
}
// 构造保存路径,防止路径穿越
filename := filepath.Base(handler.Filename)
dstPath := filepath.Join(uploadDir, filename)
// 创建目标文件
dst, err := os.Create(dstPath)
if err != nil {
http.Error(w, "创建文件失败", http.StatusInternalServerError)
return
}
defer dst.Close()
// 拷贝文件内容
_, err = io.Copy(dst, file)
if err != nil {
http.Error(w, "保存文件失败", http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "文件上传成功: %s (%d bytes)", handler.Filename, handler.Size)
}
func main() {
// 注册处理函数
http.HandleFunc("/upload", uploadHandler)
// 提供静态页面用于测试(可选)
http.Handle("/", http.FileServer(http.Dir(".")))
fmt.Println("服务器启动,端口: 8080")
http.ListenAndServe(":8080", nil)
}
2. 前端:HTML 文件上传表单
在项目根目录下创建一个
index.html文件,用于测试上传功能。 index.html 内容:
文件上传测试
上传文件
3. 安全与优化建议
实际项目中需注意以下几点:
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
立即学习“go语言免费学习笔记(深入)”;
-
限制文件大小:通过
ParseMultipartForm
参数控制,避免内存耗尽。 - 校验文件类型:检查 MIME 类型或文件头,防止恶意文件上传。
- 防止重名覆盖:使用 UUID 或时间戳重命名文件。
-
路径安全:使用
filepath.Base
避免路径穿越攻击。 -
设置超时:在
http.Server
中配置读写超时。
4. 运行方式
将上面的 Go 代码保存为
main.go,HTML 保存为
index.html,然后执行:
go run main.go
访问
http://localhost:8080即可看到上传页面。
基本上就这些。不复杂但容易忽略细节,尤其是安全方面。按需扩展即可。









