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

84 lines
2.0 KiB
Go
Raw Permalink Normal View History

2024-06-04 21:22:50 +08:00
package file
import (
"bytes"
"encoding/hex"
"io"
"log"
"mini_server/internal/dao"
"mini_server/internal/server/help"
"mini_server/internal/server/httpreply"
"net/http"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
)
type UploadReply struct {
FileId string `json:"file_id"` // 文件uuid返回file_uuid
}
// 文件上传接口
func Upload(c *gin.Context) {
reply := httpreply.NewDefaultReplyData()
defer httpreply.Reply(c, reply)
userId, ok := help.GetUserId(c)
if !ok {
reply.Status = http.StatusNotFound
reply.Message = "无法获取用户信息"
return
}
file, err := c.FormFile("file")
if err != nil {
reply.Status = http.StatusBadRequest
reply.Message = "无法获取文件信息"
return
}
// 读取文件中的数据,并写入到数据库中
reader, _ := file.Open()
defer reader.Close()
// 添加文件大小限制目前使用mediumblob有16M存储限制
if file.Size >= int64(1024*1024*16) {
reply.Status = http.StatusRequestEntityTooLarge
reply.Message = "上传文件超过限制目前最多支持16M文件上传"
return
}
// 拷贝数据
buf := bytes.NewBuffer(nil)
if _, err := io.Copy(buf, reader); err != nil {
reply.Status = http.StatusInternalServerError
reply.Message = "copy file failed"
return
}
fileType := http.DetectContentType(buf.Bytes())
log.Printf("文件上传请求,文件名:%v, 文件大小:%d, 文件类型:%v", file.Filename, file.Size, fileType)
// 将数据写入数据库中
bytesUUID, _ := uuid.NewUUID()
uuid := hex.EncodeToString(bytesUUID[:])
data := &dao.File{
UUID: uuid, // 作为唯一标识
UserId: userId,
FileType: fileType,
FileName: file.Filename,
FileSize: uint32(file.Size),
FileContent: buf.Bytes(),
}
if _, err = dao.File_Insert(data); err != nil {
logrus.Errorf("dao.File_Insert failed,err:%v", err)
reply.Status = http.StatusInternalServerError
reply.Message = "文件上传保存失败"
return
}
reply.Data = &UploadReply{FileId: uuid}
}