Go 文件上传需先调用 r.ParseMultipartForm(32
在 Go 语言中实现文件上传功能,核心是使用 http.Request 的 ParseMultipartForm 和 FormFile 方法解析客户端提交的 multipart/form-data 表单,并将文件流保存到服务器本地磁盘。
Go 标准库 net/http 原生支持 multipart 文件上传。需先调用 r.ParseMultipartForm 初始化表单解析(指定最大内存缓存大小),再通过 r.FormFile 获取文件句柄和头信息。
ParseMultipartForm(32 表示最多将 32MB 以内的文件暂存在内存,超过部分写入临时磁盘文件FormFile("file") 中 "file" 需与 HTML 表单中 的 name 属性一致multipart.File(可读的文件流)和 *multipart.FileHeader(含原始文件名、大小、MIME 类型等)直接使用客户端传来的原始文件名保存存在路径遍历(如 ../../etc/passwd)或覆盖风险,必须做校验和清洗。
path.Base(header.Filename) 提取纯文件名,剥离路径部分uuid.New().String() 或时间戳 + 随机数),避免重名和猜测"./uploads/"),提前创建目录并检查权限:os.MkdirAll(uploadDir, 0755)
os.O_CREATE | os.O_WRONLY | os.O_EXCL 模式防止覆盖已有文件以下是一个最小可用的上传服务端代码片段:
package main
import (
"io"
"net/http"
"os"
"path"
"path/filepath"
)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
http.ServeFile(w, r, "upload.html") // 提供上传页面
return
}
err := r.ParseMultipartForm(32 << 20)
if err != nil {
http.Error(w, "解析表单失败: "+err.Error(), http.StatusBadRequest)
return
}
file, header, err := r.FormFile("file")
if err != nil {
http.Error(w, "获取文件失败: "+err.Error(), http.StatusBadRequest)
return
}
defer file.Close()
uploadDir := "./uploads"
os.MkdirAll(uploadDir, 0755)
// 安全处理文件名
safeName := filepath.Base(header.Filename)
dstPath := filepath.Join(uploadDir, safeName)
dst, err := os.OpenFile(dstPath, os.O_CREATE|os.O_WRONLY|os.O_EXCL, 0644)
if err != nil {
http.Error(w, "无法创建目标文件: "+err.Error(), http.StatusInternalServerError)
return
}
defer dst.Close()
if _, err := io.Copy(dst, file); err != nil {
http.Error(w, "保存文件失败: "+err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte("上传成功:" + safeName))
}
func main() {
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":8080", nil)
}
配套的 upload.html 示例:
生产环境还需考虑更多细节:
ParseMultipartForm 参数)和总请求体大小(可在中间件中用 http.MaxBytesReader 包裹 r.Body)header.Header.Get("Content-Type") 可被伪造,需读取前几字节验证)image.DecodeConfig 验证是否真实可解析{"success": true, "url": "/uploads/xxx.jpg"}),便于前端进一步处理
# go
# golang
# 标准库
# http
# 上传
# 表单
# 文件上传
# 客户端
# 是一个
# 保存文件
# 随机数
# 最多
# 句柄
# 已有
相关文章:
建站之星安装后界面空白如何解决?
存储型VPS适合搭建中小型网站吗?
建站之星后台管理系统如何操作?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
建站之星客服服务时间及联系方式如何?
宝塔面板创建网站无法访问?如何快速排查修复?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
电商网站制作公司有哪些,1688网是什么意思?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何通过免费商城建站系统源码自定义网站主题与功能?
代刷网站制作软件,别人代刷火车票靠谱吗?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站之星展会模版如何一键下载生成?
如何获取免费开源的自助建站系统源码?
如何高效完成独享虚拟主机建站?
建站之星如何通过成品分离优化网站效率?
建站主机如何选?高性价比方案全解析
Android滚轮选择时间控件使用详解
宝塔新建站点报错如何解决?
如何高效生成建站之星成品网站源码?
智能起名网站制作软件有哪些,制作logo的软件?
如何快速生成可下载的建站源码工具?
网站制作话术技巧,网站推广做的好怎么话术?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
制作旅游网站html,怎样注册旅游网站?
如何在香港服务器上快速搭建免备案网站?
定制建站是什么?如何实现个性化需求?
建站之星安装失败:服务器环境不兼容?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
建站之星后台密码遗忘或太弱?如何重置与强化?
建站之星代理平台如何选择最佳方案?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
为什么Go需要go mod文件_Go go mod文件作用说明
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
内网网站制作软件,内网的网站如何发布到外网?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何快速建站并高效导出源代码?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何在宝塔面板中创建新站点?
如何在服务器上配置二级域名建站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何续费美橙建站之星域名及服务?
建站为何优先选择香港服务器?
如何在腾讯云免费申请建站?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
定制建站价位费用解析与套餐推荐全攻略
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
教程网站设计制作软件,怎么创建自己的一个网站?
Python路径拼接规范_跨平台处理说明【指导】
已有域名能否直接搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。