wx-server/internal/server/file/download.go

63 lines
1.7 KiB
Go
Raw Permalink Normal View History

2024-06-04 21:22:50 +08:00
package file
import (
"fmt"
"mini_server/internal/config"
"mini_server/internal/dao"
"mini_server/internal/server/help"
"net/http"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)
type DownloadURI struct {
FileId string `uri:"file_id" binding:"len=32"`
}
// 文件下载接口
func Download(c *gin.Context) {
var param DownloadURI
if err := c.ShouldBindUri(&param); err != nil {
c.JSON(http.StatusBadRequest, fmt.Sprintf("invalid download uri,err:%v", err))
return
}
fileId := param.FileId
var data *dao.File
var err error
var ok bool
if config.FileCacheEnable { // 从文件缓存中查询
if data, ok = help.GetFileCache(fileId); ok {
logrus.Tracef("从内存缓存中获取文件数据file_uuid:%v", fileId)
}
}
if data == nil { // 未获取到文件缓存数据
logrus.Tracef("从msyql中获取文件数据file_uuid:%v", fileId)
data, err = dao.File_Query(param.FileId)
if err != nil {
logrus.Errorf("文件下载失败,fileId:%s,err:%v", param.FileId, err)
c.JSON(http.StatusInternalServerError, "文件下载失败")
return
}
if data == nil { // 文件不存在
logrus.Errorf("文件下载失败文件file_id:%v不存在", param.FileId)
c.JSON(http.StatusNotFound, "文件不存在")
return
}
if config.FileCacheEnable { // 更新到文件缓存中
help.SetFileCache(fileId, data)
}
}
logrus.Tracef("文件%s下载成功文件大小:%d数据库中blob实际大小:%d", data.FileName, data.FileSize, len(data.FileContent))
c.Header("Content-Disposition", "attachment;filename="+data.FileName)
c.Header("Content-Type", data.FileType)
c.Header("Accept-Length", fmt.Sprintf("%d", data.FileSize))
c.Writer.WriteHeader(http.StatusOK)
c.Writer.Write(data.FileContent)
}