UploadFile 上传单个文件 @Summary 上传单个文件 @Description 上传批量上传中的单个文件,支持同名文件处理模式:sequence(默认)自动添加序号,replace删除原文件 @Tags 批量上传 @Accept multipart/form-data @Produce json @Security BearerAuth @Param batch_id path string true "批次ID" @Param file formData file true "上传文件" @Param upload_token formData string true "上传令
(c *gin.Context)
| 117 | // @Failure 500 {object} model.CommonResponse "服务器内部错误" |
| 118 | // @Router /api/files/upload/batch/{batch_id}/file [post] |
| 119 | func (ctrl *BatchUploadController) UploadFile(c *gin.Context) { |
| 120 | batchID := c.Param("batch_id") |
| 121 | |
| 122 | // 验证批次和权限 |
| 123 | batch, err := ctrl.manager.GetBatch(batchID) |
| 124 | if err != nil { |
| 125 | c.JSON(http.StatusNotFound, model.NotFound.ToResponse(err)) |
| 126 | return |
| 127 | } |
| 128 | |
| 129 | // 获取上传参数 |
| 130 | uploadToken := c.PostForm("upload_token") |
| 131 | fileID := c.PostForm("file_upload_id") |
| 132 | duplicateMode := service.DuplicateMode(c.PostForm("duplicate_mode")) |
| 133 | if duplicateMode == "" { |
| 134 | duplicateMode = service.DuplicateModeSequence |
| 135 | } |
| 136 | |
| 137 | // 添加验证file_id是否存在于批次中 |
| 138 | fileUpload, exists := batch.GetFileUpload(fileID) |
| 139 | if !exists { |
| 140 | c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(errors.New("无效的文件ID"))) |
| 141 | return |
| 142 | } |
| 143 | relativePath := fileUpload.RelativePath |
| 144 | |
| 145 | // 验证上传令牌 |
| 146 | if !ctrl.manager.ValidateUploadToken(batchID, uploadToken) { |
| 147 | c.JSON(http.StatusUnauthorized, model.AuthFailed.ToResponse(errors.New("无效的上传令牌"))) |
| 148 | return |
| 149 | } |
| 150 | |
| 151 | if config.DOCUMENT_SINGLE_FILE_MAX_SIZE > 0 { |
| 152 | if err := c.Request.ParseMultipartForm(64 << 20); err != nil { |
| 153 | c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("文件上传信息过大: %v", err))) |
| 154 | return |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | // 获取上传文件 |
| 159 | fileHeader, err := c.FormFile("file") |
| 160 | if err != nil { |
| 161 | c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(err)) |
| 162 | return |
| 163 | } |
| 164 | |
| 165 | if config.DOCUMENT_SINGLE_FILE_MAX_SIZE > 0 && fileHeader.Size > config.DOCUMENT_SINGLE_FILE_MAX_SIZE { |
| 166 | c.JSON(http.StatusBadRequest, model.FileError.ToResponse( |
| 167 | fmt.Errorf("文件大小超过限制,最大允许: %dMB", config.DOCUMENT_SINGLE_FILE_MAX_SIZE/(1024*1024)))) |
| 168 | return |
| 169 | } |
| 170 | |
| 171 | // 提交上传任务 |
| 172 | task := &service.UploadTask{ |
| 173 | BatchID: batchID, |
| 174 | FileID: fileID, |
| 175 | RelativePath: relativePath, |
| 176 | FileHeader: fileHeader, |
nothing calls this directly
no test coverage detected