Files
Sillyv2/core/node_static.go
T
cdle a557523a11 x
2023-06-10 12:33:14 +08:00

95 lines
2.1 KiB
Go

package core
import (
"encoding/base64"
"fmt"
"image"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strings"
"sync"
"github.com/gin-gonic/gin"
)
var statics sync.Map
func addStatic(uuid, path string) {
statics.Store(uuid, path)
}
func remStatic(uuid string) {
statics.Delete(uuid)
}
func FindFile(c *gin.Context) {
// 获取文件名
filename := c.Param("filename")
statics.Range(func(_, value any) bool {
path := value.(string)
// 拼接文件路径
filepath := strings.ReplaceAll(filepath.Join(path, filename), "\\/", "\\")
// 判断文件是否存在
_, err := os.Stat(filepath)
if err == nil {
// 文件存在,读取文件内容并返回
file, err := ioutil.ReadFile(filepath)
if err != nil {
c.AbortWithError(http.StatusInternalServerError, err)
return true
}
// 根据文件类型设置Content-Type
contentType := http.DetectContentType(file)
c.Header("Content-Type", contentType)
// 返回文件内容
c.Data(http.StatusOK, contentType, file)
return false
} else {
console.Log(err)
}
return true
})
// 如果文件不存在,返回404错误
c.AbortWithStatus(http.StatusNotFound)
}
// Server.GET("/api/file/:filename", FindFile)
// Server.GET("/api/decode/:random", Base642Binary)
func Base642Binary(c *gin.Context) {
random := c.Param("random")
s, ok := temp.Get("base64_" + random).(string)
if !ok {
c.String(http.StatusBadRequest, "Invalid input")
return
}
input := strings.TrimPrefix(s, "base64://")
data, err := base64.StdEncoding.DecodeString(input)
if err != nil {
c.String(http.StatusBadRequest, "Invalid input")
return
}
// 解析图片格式
_, format, err := image.DecodeConfig(strings.NewReader(string(data)))
fmt.Println(format, err)
if err != nil {
c.Header("Content-Type", "application/octet-stream")
} else {
// 根据图片格式设置响应头
switch format {
case "jpeg":
c.Header("Content-Type", "image/jpeg")
case "png":
c.Header("Content-Type", "image/png")
default:
c.Header("Content-Type", "application/octet-stream")
return
}
}
c.Data(http.StatusOK, "application/octet-stream", data)
}