93 lines
2.7 KiB
Go
93 lines
2.7 KiB
Go
|
|
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)
|
||
|
|
}
|