175 lines
4.2 KiB
Go
175 lines
4.2 KiB
Go
package routers
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"ops/models"
|
|
"path"
|
|
"path/filepath"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func file_save() {
|
|
|
|
}
|
|
|
|
func ApiFiles(r *gin.RouterGroup) {
|
|
|
|
//getfile := r.Group("/get") //定义上传组
|
|
r.GET("/:mode/:hash", func(ctx *gin.Context) {
|
|
hash := ctx.Param("hash")
|
|
mode := ctx.Param("mode")
|
|
// filename := ctx.Param("filename")
|
|
// fmt.Println(filename)
|
|
|
|
download := false
|
|
isPartOK := false
|
|
|
|
if mode == "get" {
|
|
isPartOK = true
|
|
download = true
|
|
}
|
|
if mode == "download" {
|
|
isPartOK = true
|
|
download = false
|
|
}
|
|
if isPartOK {
|
|
file_info := models.TabFileInfo_{
|
|
Sha256: hash,
|
|
}
|
|
if models.DB.Where(&file_info).First(&file_info).Error == nil {
|
|
ReturnFile(ctx, &file_info, download)
|
|
} else {
|
|
//fmt.Println("not fund")
|
|
ReturnJson(ctx, "file_not_found", nil)
|
|
}
|
|
} else {
|
|
ReturnJson(ctx, "file_part_err", nil)
|
|
}
|
|
|
|
})
|
|
|
|
upload := r.Group("/upload") //定义上传组
|
|
//上传文件的总接口,能上传什么文件应该由后端决定,前端仅做相应限制
|
|
|
|
upload.POST("/image", func(ctx *gin.Context) {
|
|
|
|
cookie := ctx.PostForm("cookie") //首先需要判断用户是否登录
|
|
|
|
//通过cookie获取用户信息
|
|
user, err := AuthenticationAuthorityFromCookie(cookie)
|
|
if err == nil {
|
|
file, err := ctx.FormFile("file")
|
|
|
|
if err == nil {
|
|
if file.Filename != "" {
|
|
//限制文件大小
|
|
if file.Size > 512 {
|
|
if file.Size < int64(models.ConfigsFile.MaxSize) {
|
|
|
|
//判断文件mime是否合法
|
|
// 打开文件流
|
|
src_mime, _ := file.Open()
|
|
defer src_mime.Close()
|
|
// 读取前512字节用于MIME检测
|
|
buffer := make([]byte, 512)
|
|
io.ReadFull(src_mime, buffer)
|
|
// 检测MIME类型
|
|
mimeType := http.DetectContentType(buffer)
|
|
file_extname := models.ConfigsFile.AllowImageMime[mimeType]
|
|
if file_extname != "" {
|
|
filename := filepath.Base(file.Filename) // 防御性处理路径分隔符
|
|
// 计算哈希值
|
|
hash_str, err := models.SHA256HashFile(file)
|
|
if err == nil {
|
|
//fmt.Println(hash_str)
|
|
//fmt.Println(filename)
|
|
//这是上传的真实路径
|
|
dst := path.Join(models.ConfigsFile.Pahts["image"], hash_str)
|
|
//fmt.Println(dst)
|
|
//判断文件是否存在避免重复保存
|
|
if models.FileExists(dst) {
|
|
//fmt.Println("文件存在")
|
|
|
|
} else {
|
|
//fmt.Println("文件no存在")
|
|
ferr := ctx.SaveUploadedFile(file, dst)
|
|
if ferr == nil {
|
|
//文件保存成功
|
|
|
|
} else {
|
|
|
|
ReturnJson(ctx, "file_save_err", nil)
|
|
ctx.Abort() //end
|
|
return
|
|
}
|
|
}
|
|
//记录到数据库
|
|
//先检查数据库有没有数据
|
|
fund_file_info := models.TabFileInfo_{
|
|
Name: filename,
|
|
Sha256: hash_str,
|
|
Mime: mimeType,
|
|
Type: "image",
|
|
UserID: user.ID,
|
|
}
|
|
fund_file_info2 := models.TabFileInfo_{}
|
|
|
|
models.DB.Where(&fund_file_info).Find(&fund_file_info2)
|
|
|
|
if fund_file_info2.ID != 0 {
|
|
fund_file_info2.Const += 1
|
|
models.DB.Where(&fund_file_info).Updates(&fund_file_info2)
|
|
} else {
|
|
fund_file_info.Path = dst
|
|
models.DB.Create(&fund_file_info) // 传入指针
|
|
}
|
|
|
|
//返回后台存储的URL
|
|
download_URL := path.Join("/api/files/download/", hash_str)
|
|
get_URL := path.Join("/api/files/get/", hash_str)
|
|
re := map[string]interface{}{
|
|
"download": download_URL,
|
|
"get": get_URL,
|
|
"hash": hash_str,
|
|
}
|
|
|
|
ReturnJson(ctx, "apiOK", re)
|
|
|
|
} else {
|
|
ReturnJson(ctx, "file_hash_err", nil)
|
|
}
|
|
|
|
} else {
|
|
ReturnJson(ctx, "file_mime_err", nil)
|
|
}
|
|
} else {
|
|
ReturnJson(ctx, "file_size_err", nil)
|
|
}
|
|
|
|
} else {
|
|
ReturnJson(ctx, "file_size_err", nil)
|
|
}
|
|
|
|
} else {
|
|
ReturnJson(ctx, "file_name_err", nil)
|
|
}
|
|
|
|
} else {
|
|
ReturnJson(ctx, "file_get_err", nil)
|
|
}
|
|
|
|
} else {
|
|
ReturnJson(ctx, "userCookieError", nil)
|
|
}
|
|
|
|
//ReturnJson(ctx, "apiErr", nil)
|
|
})
|
|
|
|
// r.GET("/upload", func(ctx *gin.Context) {
|
|
// ReturnJson(ctx, "apiOK", nil)
|
|
// })
|
|
|
|
}
|