84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
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}
|
||
}
|