package handlers import ( "strings" "github.com/gin-gonic/gin" "go.uber.org/zap" "tyapi-server/internal/application/product" "tyapi-server/internal/shared/interfaces" ) // FileDownloadHandler 文件下载处理器 type FileDownloadHandler struct { uiComponentAppService product.UIComponentApplicationService responseBuilder interfaces.ResponseBuilder logger *zap.Logger } // NewFileDownloadHandler 创建文件下载处理器 func NewFileDownloadHandler( uiComponentAppService product.UIComponentApplicationService, responseBuilder interfaces.ResponseBuilder, logger *zap.Logger, ) *FileDownloadHandler { return &FileDownloadHandler{ uiComponentAppService: uiComponentAppService, responseBuilder: responseBuilder, logger: logger, } } // DownloadUIComponentFile 下载UI组件文件 // @Summary 下载UI组件文件 // @Description 下载UI组件文件 // @Tags 文件下载 // @Accept json // @Produce application/octet-stream // @Param id path string true "UI组件ID" // @Success 200 {file} file "文件内容" // @Failure 400 {object} interfaces.Response "请求参数错误" // @Failure 404 {object} interfaces.Response "UI组件不存在或文件不存在" // @Failure 500 {object} interfaces.Response "服务器内部错误" // @Router /api/v1/ui-components/{id}/download [get] func (h *FileDownloadHandler) DownloadUIComponentFile(c *gin.Context) { id := c.Param("id") if id == "" { h.responseBuilder.BadRequest(c, "UI组件ID不能为空") return } // 获取UI组件信息 component, err := h.uiComponentAppService.GetUIComponentByID(c.Request.Context(), id) if err != nil { h.logger.Error("获取UI组件失败", zap.Error(err), zap.String("id", id)) h.responseBuilder.InternalError(c, "获取UI组件失败") return } if component == nil { h.responseBuilder.NotFound(c, "UI组件不存在") return } if component.FilePath == nil { h.responseBuilder.NotFound(c, "UI组件文件不存在") return } // 获取文件路径 filePath, err := h.uiComponentAppService.DownloadUIComponentFile(c.Request.Context(), id) if err != nil { h.logger.Error("获取UI组件文件路径失败", zap.Error(err), zap.String("id", id)) h.responseBuilder.InternalError(c, "获取UI组件文件路径失败") return } // 设置下载文件名 fileName := component.ComponentName if !strings.HasSuffix(strings.ToLower(fileName), ".zip") { fileName += ".zip" } // 设置响应头 c.Header("Content-Description", "File Transfer") c.Header("Content-Transfer-Encoding", "binary") c.Header("Content-Disposition", "attachment; filename="+fileName) c.Header("Content-Type", "application/octet-stream") // 发送文件 c.File(filePath) }