123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package controller
- import (
- cm "app.yhyue.com/moapp/jybase/common"
- "bindresume/config"
- "fmt"
- "github.com/gin-gonic/gin"
- "log"
- "math/rand"
- "mime/multipart"
- "net/http"
- "os"
- "path/filepath"
- "strings"
- "time"
- )
- func UploadFile(r *gin.Context) {
- // 设置内存限制(100 MB)
- if err := r.Request.ParseMultipartForm(100 << 20); err != nil {
- r.JSON(http.StatusBadRequest, gin.H{
- "error": "文件大小超过限制(最大100MB)",
- })
- return
- }
- // 获取所有文件(兼容多字段)
- form, err := r.MultipartForm()
- if err != nil {
- r.JSON(http.StatusBadRequest, gin.H{
- "error": "无法解析表单",
- })
- return
- }
- // 收集所有上传的文件
- var allFiles []*multipart.FileHeader
- for fieldName := range form.File {
- allFiles = append(allFiles, form.File[fieldName]...)
- }
- // 处理上传结果
- successFiles := make([]string, 0)
- failedFiles := make(map[string]string)
- for _, fileHeader := range allFiles {
- // 生成唯一文件名(时间戳+随机数)
- uniqueName := fmt.Sprintf("%s_%d%s",
- time.Now().Format("20060102150405001")+cm.GetComplexRandom(8, 0, 0),
- rand.Intn(1000),
- filepath.Ext(fileHeader.Filename),
- )
- // 检查文件类型(示例:仅允许图片)
- allowedTypes := map[string]bool{
- ".jpg": true,
- ".jpeg": true,
- ".png": true,
- ".gif": true,
- }
- ext := filepath.Ext(uniqueName)
- if !allowedTypes[ext] {
- failedFiles[fileHeader.Filename] = "文件类型不允许"
- continue
- }
- // 保存文件
- //dst := filepath.Join(config.SysConfig.FilePath, uniqueName)
- filePath := GetFilePath(uniqueName, "bifile")
- log.Println("获取路径", filePath)
- if err := r.SaveUploadedFile(fileHeader, filePath); err != nil {
- failedFiles[fileHeader.Filename] = fmt.Sprintf("保存失败: %v", err)
- continue
- }
- successFiles = append(successFiles, fmt.Sprintf("/shareFile/%s", strings.Replace(filePath, cm.ObjToString(config.SysConfig.FilePath), "", 1)))
- }
- // 返回响应
- r.JSON(http.StatusOK, gin.H{
- "success_count": len(successFiles),
- "success_files": successFiles,
- "failed_count": len(failedFiles),
- "failed_files": failedFiles,
- })
- }
- // 获取文件路径、名称
- func GetFilePath(fm, types string) (s string) {
- var tm = time.Now().Format("20060102")
- var path = config.SysConfig.FilePath + types + "/" + tm[:4] + "/" + tm[4:6] + "/"
- os.MkdirAll(path, 0700)
- return path + fm
- }
|