Files
message-pusher/controller/file.go
2022-11-11 15:35:02 +08:00

132 lines
3.0 KiB
Go

package controller
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"message-pusher/common"
"message-pusher/model"
"net/http"
"os"
"path/filepath"
"strings"
"time"
)
type FileDeleteRequest struct {
Id int
Link string
//Token string
}
func UploadFile(c *gin.Context) {
uploadPath := common.UploadPath
//saveToDatabase := true
//path := c.PostForm("path")
//if path != "" { // Upload to explorer's path
// uploadPath = filepath.Join(common.ExplorerRootPath, path)
// if !strings.HasPrefix(uploadPath, common.ExplorerRootPath) {
// // In this case the given path is not valid, so we reset it to ExplorerRootPath.
// uploadPath = common.ExplorerRootPath
// }
// saveToDatabase = false
//}
description := c.PostForm("description")
if description == "" {
description = "无描述信息"
}
uploader := c.GetString("username")
if uploader == "" {
uploader = "匿名用户"
}
currentTime := time.Now().Format("2006-01-02 15:04:05")
form, err := c.MultipartForm()
if err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
return
}
files := form.File["file"]
for _, file := range files {
// In case someone wants to upload to other folders.
filename := filepath.Base(file.Filename)
link := filename
savePath := filepath.Join(uploadPath, filename)
if _, err := os.Stat(savePath); err == nil {
// File already existed.
t := time.Now()
timestamp := t.Format("_2006-01-02_15-04-05")
ext := filepath.Ext(filename)
if ext == "" {
link += timestamp
} else {
link = filename[:len(filename)-len(ext)] + timestamp + ext
}
savePath = filepath.Join(uploadPath, link)
}
if err := c.SaveUploadedFile(file, savePath); err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error()))
return
}
// save to database
fileObj := &model.File{
Description: description,
Uploader: uploader,
Time: currentTime,
Link: link,
Filename: filename,
}
err = fileObj.Insert()
if err != nil {
_ = fmt.Errorf(err.Error())
}
}
c.Redirect(http.StatusSeeOther, "./")
}
func DeleteFile(c *gin.Context) {
var deleteRequest FileDeleteRequest
err := json.NewDecoder(c.Request.Body).Decode(&deleteRequest)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"message": "无效的参数",
})
return
}
fileObj := &model.File{
Id: deleteRequest.Id,
}
model.DB.Where("id = ?", deleteRequest.Id).First(&fileObj)
err = fileObj.Delete()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": err.Error(),
})
} else {
message := "文件删除成功"
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": message,
})
}
}
func DownloadFile(c *gin.Context) {
path := c.Param("file")
fullPath := filepath.Join(common.UploadPath, path)
if !strings.HasPrefix(fullPath, common.UploadPath) {
// We may being attacked!
c.Status(403)
return
}
c.File(fullPath)
// Update download counter
go func() {
model.UpdateDownloadCounter(path)
}()
}