当前位置: 首页 > news >正文

Go语言实战案例:文件上传服务

在 Web 开发中,文件上传 是常见需求,例如头像上传、文档存储、图片分享等功能。Go 语言的标准库 net/http 已经内置了对 multipart/form-data 类型的支持,能让我们轻松构建一个文件上传服务。

本文将带你实现一个可运行的文件上传接口,并附带 HTML 表单和 curl 测试方法。


一、目标功能

  • • 路径:/upload
  • • 方法:POST
  • • 表单字段:
    • • file:上传文件
    • • desc:文件描述(可选)
  • • 保存文件到本地 ./uploads 目录
  • • 返回 JSON 结果

二、核心知识点

  • • r.ParseMultipartForm(maxMemory):解析 multipart/form-data 表单
  • • r.FormFile("file"):获取上传的文件
  • • io.Copy(dst, src):保存文件到本地
  • • 表单字段获取:r.FormValue("desc")
  • • 文件权限控制:os.Create() / os.MkdirAll()

三、完整代码

package mainimport ("encoding/json""fmt""io""net/http""os""path/filepath"
)type UploadResponse struct {Filename string `json:"filename"`Size     int64  `json:"size"`Desc     string `json:"desc"`Status   string `json:"status"`
}func uploadHandler(w http.ResponseWriter, r *http.Request) {if r.Method != http.MethodPost {http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)return}// 解析上传表单(maxMemory 5MB,超过部分存临时文件)err := r.ParseMultipartForm(5 << 20)if err != nil {http.Error(w, "Error parsing form: "+err.Error(), http.StatusBadRequest)return}// 获取表单字段desc := r.FormValue("desc")// 获取文件file, handler, err := r.FormFile("file")if err != nil {http.Error(w, "Error retrieving file: "+err.Error(), http.StatusBadRequest)return}defer file.Close()// 确保保存目录存在os.MkdirAll("./uploads", os.ModePerm)// 保存文件filePath := filepath.Join("uploads", handler.Filename)dst, err := os.Create(filePath)if err != nil {http.Error(w, "Error saving file: "+err.Error(), http.StatusInternalServerError)return}defer dst.Close()size, err := io.Copy(dst, file)if err != nil {http.Error(w, "Error writing file: "+err.Error(), http.StatusInternalServerError)return}// 返回 JSON 响应w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(UploadResponse{Filename: handler.Filename,Size:     size,Desc:     desc,Status:   "success",})
}func main() {http.HandleFunc("/upload", uploadHandler)fmt.Println("文件上传服务已启动:http://localhost:8080/upload")http.ListenAndServe(":8080", nil)
}

四、测试方法

1. HTML 表单测试

保存为 upload.html

<!DOCTYPE html>
<html>
<body>
<h2>文件上传测试</h2>
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">文件描述: <input type="text" name="desc"><br><br>选择文件: <input type="file" name="file"><br><br><input type="submit" value="上传">
</form>
</body>
</html>

打开浏览器选择文件并提交。


2. curl 命令测试

curl -X POST http://localhost:8080/upload \-F "desc=测试图片" \-F "file=@test.png"

五、运行效果

成功上传后返回:

{"filename": "test.png","size": 15324,"desc": "测试图片","status": "success"
}

文件会保存在 ./uploads/test.png


六、注意事项

  1. 1. 上传限制
    通过 r.ParseMultipartForm(maxMemory) 控制内存占用,超过部分会写入临时文件。
  2. 2. 安全性
    • • 校验文件类型(避免执行恶意文件)
    • • 生成唯一文件名(避免覆盖)
    • • 设置合理的文件大小限制(可用 http.MaxBytesReader
  3. 3. 跨域请求
    如果前端与后端不在同一域名,需要设置 Access-Control-Allow-Origin 等 CORS 头。

七、进阶扩展

  • • 上传时自动生成文件唯一 ID(防止文件名冲突)
  • • 返回文件访问 URL
  • • 将文件上传到云存储(如 AWS S3、阿里云 OSS)
  • • 支持多文件同时上传(r.MultipartForm.File["file"]

http://www.dtcms.com/a/322272.html

相关文章:

  • 香橙派 RK3588 部署千问大模型 Qwen2-VL-2B 推理视频
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • BGP 笔记
  • C语言gdb调试
  • 母线电压采样芯片的四大类——汽车级选型对比表
  • 101和201复制卡技术难点与解决方案
  • Express中间件和路由及响应方法
  • 软件定义车辆加速推进汽车电子技术
  • Python如何将图片转换为PDF格式
  • 2025最新高频前端面试题解析(含Vue/React/JS核心考点)
  • day30-HTTP
  • Ubuntu Server 22 虚拟机空间扩容
  • B.10.01.3-性能优化实战:从JVM到数据库的全链路优化
  • stm32项目(25)——基于stm32的植物生长箱环境监测系统
  • 微信小程序中实现表单自动填充功能的方法
  • 自动化一键部署 LNMP 环境
  • NodeJs学习日志(3):express,sequelize进行增删改查(CRUD)
  • 【QT】QMainWindow:打造专业级桌面应用的基石
  • java之父-新特性
  • 数据结构(一)顺序表
  • 【JVM】深入解析Java虚拟机
  • Ubuntu下搭建LVGL模拟器
  • react之React.cloneElement()
  • 深入剖析C++ STL原理:打开高效编程大门的钥匙
  • [每周一更]-(第155期):深入Go反射机制:架构师视角下的动态力量与工程智慧
  • Web3: DeFi借贷的安全基石, 了解喂价与清算机制的原理与重要性
  • Typora上传图片保存到assets目录下
  • ARM CPU 安全更新:Training Solo(关于 Spectre-v2 攻击中域隔离机制的局限性)
  • 学习:JS[8]本地存储+正则表达式
  • Matlab系列(004) 一 Matlab分析正态分布(高斯分布)