package handler import ( "ops/internal/service" "ops/pkg/response" "github.com/gin-gonic/gin" "gorm.io/gorm" ) type FileHandler struct { service service.FileService } func NewFileHandler(db *gorm.DB) *FileHandler { return &FileHandler{ service: service.NewFileService(db), } } // UploadFile 上传文件 // @Summary 上传文件 // @Description 上传文件到服务器,支持图片、文档等多种类型 // @Tags 文件管理 // @Accept multipart/form-data // @Produce json // @Param userID header string false "用户ID" default("") // @Param file formData file true "文件内容" // @Param type formData string false "文件类型" default(image) // @Param description formData string false "文件描述" // @Success 200 {object} response.StandardResponse "成功" // @Failure 400 {object} response.StandardResponse "参数错误" // @Failure 401 {object} response.StandardResponse "未授权" // @Failure 413 {object} response.StandardResponse "文件过大" // @Failure 415 {object} response.StandardResponse "文件类型不支持" // @Failure 500 {object} response.StandardResponse "服务器错误" // @Router /api/v1/files/upload [post] func (h *FileHandler) UploadFile(c *gin.Context) { // 从上下文中获取用户ID userID, exists := c.Get("userID") if !exists { response.Unauthorized(c) return } // 获取文件类型参数 fileType := c.PostForm("type") if fileType == "" { fileType = "image" // 默认类型为图片 } // 获取文件描述 description := c.PostForm("description") // 获取上传的文件 file, err := c.FormFile("file") if err != nil { response.BadRequest(c, "请选择要上传的文件") return } // 调用Service上传文件 uploadResponse, success := h.service.UploadFile(c, userID.(uint), file, fileType, description) if !success { response.BadRequest(c, "文件上传失败,请检查文件格式和大小") return } response.Success(c, uploadResponse) } // GetFileList 获取文件列表 // @Summary 获取文件列表 // @Description 获取当前用户上传的文件列表 // @Tags 文件管理 // @Accept json // @Produce json // @Param userID header string false "用户ID" default("") // @Param type query string false "文件类型过滤" // @Param page query int false "页码" default(1) // @Param entries query int false "每页数量" default(20) // @Success 200 {object} response.StandardResponse "成功" // @Failure 400 {object} response.StandardResponse "参数错误" // @Failure 401 {object} response.StandardResponse "未授权" // @Router /api/v1/files/list [get] func (h *FileHandler) GetFileList(c *gin.Context) { // 从上下文中获取用户ID userID, exists := c.Get("userID") if !exists { response.Unauthorized(c) return } // 获取查询参数 fileType := c.Query("type") page := GetIntParam(c, "page", 1) entries := GetIntParam(c, "entries", 20) // 调用Service获取文件列表 fileListResponse, success := h.service.GetFileList(userID.(uint), fileType, page, entries) if !success { response.BadRequest(c, "参数错误") return } response.Success(c, fileListResponse) } // GetFileByID 获取文件信息 // @Summary 获取文件信息 // @Description 根据文件ID获取文件详细信息 // @Tags 文件管理 // @Accept json // @Produce json // @Param userID header string false "用户ID" default("") // @Param id path int true "文件ID" // @Success 200 {object} response.StandardResponse "成功" // @Failure 401 {object} response.StandardResponse "未授权" // @Failure 404 {object} response.StandardResponse "文件不存在" // @Router /api/v1/files/{id} [get] func (h *FileHandler) GetFileByID(c *gin.Context) { // 从上下文中获取用户ID userID, exists := c.Get("userID") if !exists { response.Unauthorized(c) return } // 获取文件ID fileID := GetUintParam(c, "id") if fileID == 0 { response.BadRequest(c, "文件ID无效") return } // 调用Service获取文件信息 file, success := h.service.GetFileByID(fileID, userID.(uint)) if !success { response.Error(c, "-100", "文件不存在或无权限访问") return } response.Success(c, gin.H{ "file_id": file.ID, "name": file.Name, "sha256": file.Sha256, "mime": file.Mime, "type": file.Type, "size": file.Const, // 注意:这里const字段实际上存储的是使用次数,需要确认实际字段 "created_at": file.Date.Format("2006-01-02T15:04:05Z"), "path": file.Path, }) } // DeleteFile 删除文件 // @Summary 删除文件 // @Description 删除用户上传的文件 // @Tags 文件管理 // @Accept json // @Produce json // @Param userID header string false "用户ID" default("") // @Param id path int true "文件ID" // @Success 200 {object} response.StandardResponse "成功" // @Failure 401 {object} response.StandardResponse "未授权" // @Failure 404 {object} response.StandardResponse "文件不存在" // @Router /api/v1/files/{id} [delete] func (h *FileHandler) DeleteFile(c *gin.Context) { // 从上下文中获取用户ID userID, exists := c.Get("userID") if !exists { response.Unauthorized(c) return } // 获取文件ID fileID := GetUintParam(c, "id") if fileID == 0 { response.BadRequest(c, "文件ID无效") return } // 调用Service删除文件 success := h.service.DeleteFile(fileID, userID.(uint)) if !success { response.Error(c, "-100", "文件删除失败,文件不存在或无权限") return } response.Success(c, gin.H{"message": "文件删除成功"}) } // DownloadFile 下载文件 // @Summary 下载文件 // @Description 下载文件内容(直接下载) // @Tags 文件管理 // @Accept json // @Produce application/octet-stream // @Param hash path string true "文件SHA256哈希值" // @Success 200 {file} binary "文件内容" // @Failure 404 {object} response.StandardResponse "文件不存在" // @Router /api/v1/files/download/{hash} [get] func (h *FileHandler) DownloadFile(c *gin.Context) { hash := c.Param("hash") if hash == "" { response.BadRequest(c, "文件哈希值无效") return } // 调用Service下载文件 success := h.service.DownloadFile(c, hash, true) if !success { response.Error(c, "-100", "文件不存在") return } } // GetFile 获取文件(预览) // @Summary 获取文件(预览) // @Description 获取文件内容(浏览器预览) // @Tags 文件管理 // @Accept json // @Produce * // @Param hash path string true "文件SHA256哈希值" // @Success 200 {file} binary "文件内容" // @Failure 404 {object} response.StandardResponse "文件不存在" // @Router /api/v1/files/get/{hash} [get] func (h *FileHandler) GetFile(c *gin.Context) { hash := c.Param("hash") if hash == "" { response.BadRequest(c, "文件哈希值无效") return } // 调用Service获取文件(预览模式) success := h.service.DownloadFile(c, hash, false) if !success { response.Error(c, "-100", "文件不存在") return } }