liujiandao
2023-11-16 d20acf38c36c11ee4428c3e74a17f5870dc61b51
api/v1/test/contract.go
@@ -1,8 +1,12 @@
package test
import (
   "bytes"
   "fmt"
   "github.com/gin-gonic/gin"
   "github.com/h2non/filetype"
   "go.uber.org/zap"
   "net/http"
   "srm/global"
   "srm/model/common/request"
   "srm/model/common/response"
@@ -10,6 +14,7 @@
   testReq "srm/model/test/request"
   "srm/service"
   "strconv"
   "time"
)
type ContractApi struct {
@@ -28,7 +33,7 @@
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /con/createContract [post]
func (conApi *ContractApi) CreateContract(c *gin.Context) {
   name := c.Param("name")
   name := c.PostForm("name")
   file, err := c.FormFile("file")
   if err != nil {
      c.JSON(400, gin.H{"error": err.Error()})
@@ -40,9 +45,20 @@
   defer f.Close()
   f.Read(fileContent)
   // 重置文件指针
   f.Seek(0, 0)
   // 使用 filetype 库检测文件类型
   kind, _ := filetype.Match(fileContent)
   if kind == filetype.Unknown {
      c.JSON(http.StatusBadRequest, gin.H{"error": "Unknown file type"})
      return
   }
   contract := test.Contract{
      FileName:    name,
      FileContent: fileContent,
      FileType:    kind.MIME.Value,
   }
   if err, id := conService.CreateContract(&contract); err != nil {
@@ -50,7 +66,7 @@
      response.FailWithMessage("创建失败", c)
   } else {
      //response.OkWithMessage("创建成功", c)
      response.OkWithData(gin.H{"id": id}, c)
      response.OkWithData(gin.H{"id": id, "name": name}, c)
   }
}
@@ -220,6 +236,63 @@
      //c.Writer.Header().Set("Content-Type", "application/octect-stream")
      //c.Writer.Header().Set("Content-Disposition", "attachment;filename="+contract.FileName)
      //c.Writer.Write(contract.FileContent)
      c.Data(200, "application/octect-stream", contract.FileContent)
      //c.Data(200, "application/octect-stream", contract.FileContent)
      //reader := bytes.NewReader(contract.FileContent)
      //c.DataFromReader(http.StatusOK, int64(len(contract.FileContent)), "application/pdf", reader, map[string]string{"Content-Disposition": fmt.Sprintf("attachment; filename=%s", contract.FileName)})
      reader := bytes.NewReader(contract.FileContent)
      c.Header("Content-Type", contract.FileType)
      c.Writer.Header().Set("Content-Disposition", "inline; filename="+contract.FileName)
      http.ServeContent(c.Writer, c.Request, contract.FileName, time.Now(), reader)
   }
}
// DownloadContract 下载Contract
// @Tags Contract
// @Summary 下载Contract
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data query test.Contract true "用id查询Contract"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"下载成功"}"
// @Router /con/downloadContract [get]
func (conApi *ContractApi) DownloadContract(c *gin.Context) {
   var con test.Contract
   err := c.ShouldBindQuery(&con)
   if err != nil {
      response.FailWithMessage(err.Error(), c)
      return
   }
   id := c.Query("id")
   if id == "" {
      response.FailWithMessage("id不能为空", c)
      return
   }
   val64, err := strconv.ParseUint(id, 10, 64)
   if err != nil {
      response.FailWithMessage("id格式错误", c)
      return
   }
   // Convert uint64 to uint
   conId := uint(val64)
   contract, err := conService.GetContract(conId)
   if err != nil {
      global.GVA_LOG.Error("获取失败!", zap.Error(err))
      response.FailWithMessage("获取失败", c)
      return
   } else {
      reader := bytes.NewReader(contract.FileContent)
      // 设置必要的头信息
      c.Header("Content-Description", "File Transfer")
      c.Header("Content-Transfer-Encoding", "binary")
      c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", contract.FileName))
      c.Header("Content-Type", contract.FileType)
      // 将文件作为响应体发送
      http.ServeContent(c.Writer, c.Request, contract.FileName, time.Now(), reader)
      c.File(contract.FileName)
   }
}