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

63 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}