This commit is contained in:
2025-10-27 15:24:08 +08:00
parent 4186cd0caf
commit df4c3dd46f
47 changed files with 1757 additions and 306 deletions

View File

@@ -9,6 +9,7 @@ import (
"path"
"time"
"github.com/google/uuid"
"github.com/h2non/filetype"
gonanoid "github.com/matoous/go-nanoid/v2"
)
@@ -20,82 +21,94 @@ const (
var ErrUnsupported = errors.New("文件格式不支持")
type FileType int
type Type int
const (
ALL FileType = 0
IMG FileType = 1
ALL Type = 0
IMG Type = 1
)
func UploadFilename(filepath string, t FileType) (string, error) {
fileOpen, err := os.Open(filepath)
if err != nil {
return "", err
}
defer fileOpen.Close()
fileBytes, err := io.ReadAll(fileOpen)
if err != nil {
return "", errors.New("failed to read file")
}
//func UploadFilename(filepath string, t Type) (string, error) {
// fileOpen, err := os.Open(filepath)
// if err != nil {
// return "", err
// }
// defer func(fileOpen *os.File) {
// _ = fileOpen.Close()
// }(fileOpen)
//
// fileBytes, err := io.ReadAll(fileOpen)
// if err != nil {
// return "", errors.New("failed to read file")
// }
//
// if t == IMG {
// // 判断是不是图片
// if !filetype.IsImage(fileBytes) {
// return "", ErrUnsupported
// }
// }
//
// kind, err := filetype.Match(fileBytes)
// if err != nil {
// return "", err
// }
//
// if kind == filetype.Unknown {
// return "", ErrUnsupported
// }
//
// // 使用 filetype 判断类型后已经去读了一些bytes了
// // 要恢复文件读取位置
// _, err = fileOpen.Seek(0, io.SeekStart)
// if err != nil {
// return "", err
// }
//
// dir := GetPath()
// exist, _ := Exists(dir)
// if !exist {
// if err := Mkdir(dir); err != nil {
// return "", err
// }
// }
//
// filename := GenFilename(kind.Extension)
// fullPath := path.Join(dir, filename)
// f, err := os.Create(fullPath)
// if err != nil {
// return "", err
// }
// defer func(f *os.File) {
// _ = f.Close()
// }(f)
//
// _, err = io.Copy(f, fileOpen)
// if err != nil {
// return "", err
// }
//
// return "/" + fullPath, nil
//}
func UploadFile(file *multipart.FileHeader, t Type) (string, error) {
if t == IMG {
// 判断是不是图片
if !filetype.IsImage(fileBytes) {
return "", ErrUnsupported
if file.Size > MaxImageSize {
return "", errors.New("failed to receive images too large")
}
}
kind, err := filetype.Match(fileBytes)
if err != nil {
return "", err
}
if kind == filetype.Unknown {
return "", ErrUnsupported
}
// 使用 filetype 判断类型后已经去读了一些bytes了
// 要恢复文件读取位置
_, err = fileOpen.Seek(0, io.SeekStart)
if err != nil {
return "", err
}
dir := GetPath()
exist, _ := Exists(dir)
if !exist {
if err := Mkdir(dir); err != nil {
return "", err
} else {
if file.Size > MaxFileSize {
return "", errors.New("failed to receive file too large")
}
}
filename := GenFilename(kind.Extension)
path := path.Join(dir, filename)
f, err := os.Create(path)
if err != nil {
return "", err
}
defer f.Close()
_, err = io.Copy(f, fileOpen)
if err != nil {
return "", err
}
return "/" + path, nil
}
func UploadFile(file *multipart.FileHeader, t FileType) (string, error) {
if file.Size > MaxFileSize {
return "", errors.New("failed to receive file too large")
}
fileOpen, err := file.Open()
if err != nil {
return "", errors.New("fialed to open file")
return "", errors.New("failed to open file")
}
defer fileOpen.Close()
defer func(fileOpen multipart.File) {
_ = fileOpen.Close()
}(fileOpen)
fileBytes, err := io.ReadAll(fileOpen)
if err != nil {
@@ -134,19 +147,21 @@ func UploadFile(file *multipart.FileHeader, t FileType) (string, error) {
}
filename := GenFilename(kind.Extension)
path := path.Join(dir, filename)
f, err := os.Create(path)
fullPath := path.Join(dir, filename)
f, err := os.Create(fullPath)
if err != nil {
return "", err
}
defer f.Close()
defer func(f *os.File) {
_ = f.Close()
}(f)
_, err = io.Copy(f, fileOpen)
if err != nil {
return "", err
}
return "/" + path, nil
return "/" + fullPath, nil
}
func GetPath() string {
@@ -154,6 +169,9 @@ func GetPath() string {
}
func GenFilename(ext string) string {
id, _ := gonanoid.New()
id, err := gonanoid.New()
if err != nil {
return uuid.New().String()
}
return fmt.Sprintf("%s.%s", id, ext)
}