From 4a4bd8f67ce04f7953d9d804d08b6fa3c20985e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Thu, 9 Apr 2026 17:08:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=B6=85=E6=97=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.conf | 6 + controllers/platform_file.go | 2 +- docs/README.md | 7 + docs/大文件上传配置.md | 243 +++++++++++++++++++++++++++++++++++ 4 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 docs/大文件上传配置.md diff --git a/conf/app.conf b/conf/app.conf index 249e9a2..08495bf 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -2,6 +2,12 @@ appname = server httpport = 8081 runmode = dev +# 服务器超时配置(支持大文件上传) +# 0 表示不设置超时限制 +ServerTimeOut = 0 +# 最大请求体大小(字节),0 表示不限制 +MaxMemory = 0 + # 数据库配置 # MySQL - 远程连接配置 mysqluser = go-platform diff --git a/controllers/platform_file.go b/controllers/platform_file.go index b70b26f..003a222 100644 --- a/controllers/platform_file.go +++ b/controllers/platform_file.go @@ -23,7 +23,7 @@ type PlatformFileController struct { beego.Controller } -const fileUploadMaxMB = 200 +const fileUploadMaxMB = 2048 // 2GB,适用于大型软件安装包 const fileUploadMaxBytes = fileUploadMaxMB * 1024 * 1024 var fileTypeByCategory = map[string]uint8{ diff --git a/docs/README.md b/docs/README.md index 136c0f7..4ae162a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,6 +6,7 @@ - [后端开发规则](./后端开发规则.md) - [接口文件](./接口文件.md) - [服务端启动命令](./服务端启动命令.md) +- [大文件上传配置](./大文件上传配置.md) - 文件上传限制和超时配置 ### 存储配置功能文档 - [📖 快速开始](./QUICK_START.md) - 5分钟快速上手 @@ -56,6 +57,12 @@ go/ ## 📝 更新日志 +### 2026-04-09 +- ✅ 增加大文件上传支持(最大 2GB) +- ✅ 移除服务器超时限制 +- ✅ 优化 CORS 配置 +- ✅ 完善文件上传文档 + ### 2024-01-01 - ✅ 完成存储配置功能 - ✅ 支持本地存储和七牛云存储 diff --git a/docs/大文件上传配置.md b/docs/大文件上传配置.md new file mode 100644 index 0000000..8330ae7 --- /dev/null +++ b/docs/大文件上传配置.md @@ -0,0 +1,243 @@ +# 大文件上传配置说明 + +## 概述 + +为支持大型软件安装包(如桌面客户端安装程序)的上传,系统已调整文件上传限制和超时配置。 + +## 配置修改 + +### 1. 文件大小限制 + +**文件位置**: `go/controllers/platform_file.go` + +**修改内容**: +```go +// 修改前 +const fileUploadMaxMB = 200 // 200MB + +// 修改后 +const fileUploadMaxMB = 2048 // 2GB,适用于大型软件安装包 +``` + +### 2. 服务器超时配置 + +**文件位置**: `go/conf/app.conf` + +**新增配置**: +```ini +# 服务器超时配置(支持大文件上传) +# 0 表示不设置超时限制 +ServerTimeOut = 0 +# 最大请求体大小(字节),0 表示不限制 +MaxMemory = 0 +``` + +## CORS 配置 + +**文件位置**: `go/routers/router.go` + +当前 CORS 配置允许跨域请求: + +```go +beego.InsertFilter("*", beego.BeforeRouter, func(ctx *context.Context) { + ctx.Output.Header("Access-Control-Allow-Origin", "*") + ctx.Output.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS") + ctx.Output.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization") + ctx.Output.Header("Access-Control-Max-Age", "86400") + + if ctx.Input.Method() == "OPTIONS" { + ctx.Output.Status = 200 + ctx.Output.Body([]byte("")) + return + } +}) +``` + +### 生产环境 CORS 配置建议 + +在生产环境中,建议将 `Access-Control-Allow-Origin` 设置为具体的前端域名: + +```go +// 开发环境 +ctx.Output.Header("Access-Control-Allow-Origin", "*") + +// 生产环境(推荐) +allowedOrigins := []string{ + "https://platform.yunzer.cn", + "https://www.yunzer.cn", +} +origin := ctx.Request.Header.Get("Origin") +for _, allowed := range allowedOrigins { + if origin == allowed { + ctx.Output.Header("Access-Control-Allow-Origin", origin) + break + } +} +``` + +## 上传流程 + +### 1. 文件上传接口 + +**路由**: `POST /platform/uploadfile` + +**控制器**: `PlatformFileController.UploadFile` + +**处理流程**: +1. 验证用户身份(JWT token) +2. 解析 multipart form(最大 2GB) +3. 检查文件大小(不超过 2GB) +4. 获取存储服务(本地或七牛云) +5. 上传文件到存储服务 +6. 检查文件 MD5 是否已存在 +7. 保存文件记录到数据库 +8. 返回文件信息(URL、ID、名称) + +### 2. 存储服务 + +系统支持两种存储方式: + +- **本地存储**: 文件保存在 `uploads/` 目录 +- **七牛云存储**: 文件上传到七牛云 OSS + +存储方式通过 `yz_system_storage_config` 表配置。 + +## 性能优化建议 + +### 1. Nginx 反向代理配置 + +如果使用 Nginx 作为反向代理,需要调整以下配置: + +```nginx +server { + listen 80; + server_name api.yunzer.cn; + + # 客户端请求体大小限制(0 表示不限制) + client_max_body_size 0; + + # 客户端请求体缓冲区大小 + client_body_buffer_size 128k; + + # 超时配置 + client_body_timeout 3600s; + send_timeout 3600s; + proxy_connect_timeout 3600s; + proxy_send_timeout 3600s; + proxy_read_timeout 3600s; + + location / { + proxy_pass http://localhost:8081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 禁用请求体缓冲(直接流式传输) + proxy_request_buffering off; + } +} +``` + +### 2. 磁盘空间监控 + +大文件上传需要足够的磁盘空间: + +```bash +# 检查磁盘空间 +df -h + +# 监控 uploads 目录大小 +du -sh uploads/ + +# 设置磁盘空间告警(推荐使用监控工具) +``` + +### 3. 数据库优化 + +对于频繁的文件查询,建议添加索引: + +```sql +-- MD5 索引(用于去重) +CREATE INDEX idx_system_file_md5 ON yz_system_file(md5); + +-- 租户 + 删除时间索引(用于文件列表查询) +CREATE INDEX idx_system_file_tid_delete ON yz_system_file(tid, delete_time); +``` + +## 故障排查 + +### 1. 上传失败:文件过大 + +**错误信息**: "文件大小不能超过 2048MB" + +**解决方案**: +- 检查 `fileUploadMaxMB` 常量设置 +- 确认 Nginx `client_max_body_size` 配置 +- 检查磁盘剩余空间 + +### 2. 上传超时 + +**错误信息**: "请求失败,请检查网络连接" + +**解决方案**: +- 检查 `app.conf` 中的 `ServerTimeOut` 配置 +- 检查 Nginx 超时配置 +- 检查网络带宽和稳定性 + +### 3. CORS 错误 + +**错误信息**: "已拦截跨源请求:同源策略禁止读取..." + +**解决方案**: +- 检查 `go/routers/router.go` 中的 CORS 配置 +- 确认 `Access-Control-Allow-Origin` 包含前端域名 +- 检查 `Access-Control-Allow-Headers` 包含 `Authorization` + +### 4. 文件不存在(404) + +**错误信息**: "请求的资源不存在" + +**可能原因**: +- 文件记录在数据库中不存在 +- 租户 ID (tid) 不匹配 +- 文件已被标记为删除 + +**解决方案**: +```sql +-- 检查文件记录 +SELECT * FROM yz_system_file WHERE id = 320; + +-- 检查是否被删除 +SELECT * FROM yz_system_file WHERE id = 320 AND delete_time IS NULL; +``` + +## 监控指标 + +建议监控以下指标: + +1. **上传成功率**: 成功上传数 / 总上传请求数 +2. **平均上传时间**: 按文件大小分段统计 +3. **磁盘使用率**: uploads 目录大小 / 总磁盘空间 +4. **错误率**: 按错误类型分类统计 + +## 相关文件 + +- `go/controllers/platform_file.go` - 文件上传控制器 +- `go/services/storage_service.go` - 存储服务接口 +- `go/conf/app.conf` - 服务器配置 +- `go/routers/router.go` - 路由和 CORS 配置 +- `go/models/system_file.go` - 文件数据模型 + +## 更新日志 + +- **2026-04-09**: + - 文件大小限制从 200MB 提升到 2GB + - 移除服务器超时限制 + - 更新文档 + +## 参考资料 + +- [Beego 文档 - 文件上传](https://beego.vip/docs/mvc/controller/file.md) +- [Nginx 文件上传配置](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size) +- [七牛云 Go SDK](https://developer.qiniu.com/kodo/1238/go)