Golang通过net/http和mime/multipart包处理文件上传,前端表单需设置enctype="multipart/form-data";2. 后端使用r.ParseMultipartForm解析请求,FormFile获取文件句柄,实现安全高效文件接收与保存。

在Golang中处理表单文件上传主要依赖标准库中的 net/http 和 mime/multipart 包。通过正确解析 multipart/form-data 请求,可以安全高效地接收并保存上传的文件。
<form enctype="multipart/form-data" action="/upload" method="post"> <input type="file" name="myfile" /> <input type="submit" value="上传文件" /> </form>
关键点是 enctype="multipart/form-data",否则服务器无法正确解析文件字段。
使用 r.ParseMultipartForm() 解析请求体,然后通过 FormFile() 获取文件句柄:
立即学习“go语言免费学习笔记(深入)”;
示例代码:
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "只允许POST请求", http.StatusMethodNotAllowed)
return
}
// 解析 multipart 表单,最大内存 32MB
err := r.ParseMultipartForm(32 << 20)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 获取名为 "myfile" 的文件
file, handler, err := r.FormFile("myfile")
if err != nil {
http.Error(w, "获取文件失败", http.StatusBadRequest)
return
}
defer file.Close()
// 打印文件信息(可选)
fmt.Fprintf(w, "上传文件名: %s\n", handler.Filename)
fmt.Fprintf(w, "文件大小: %d\n", handler.Size)
读取文件内容并写入本地磁盘,注意避免路径遍历等安全问题:
继续上面的 handler:
// 创建目标文件
dst, err := os.Create("./uploads/" + handler.Filename)
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, "文件上传成功")
}
确保 ./uploads 目录存在且有写权限。生产环境中应生成唯一文件名防止覆盖,例如使用 UUID 或时间戳。
实际项目中需考虑以下几点:
以上就是如何在Golang中处理表单文件上传的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号