hailin/internal/mods/rbac/biz/upload.biz.go
2025-06-19 10:30:46 +08:00

55 lines
1.2 KiB
Go

package biz
import (
"context"
"fmt"
"github.com/guxuan/hailin_service/internal/config"
"github.com/guxuan/hailin_service/pkg/cachex"
"github.com/guxuan/hailin_service/pkg/util"
"io"
"mime/multipart"
"os"
"path/filepath"
"strings"
)
// Role management for RBAC
type Upload struct {
Cache cachex.Cacher
Trans *util.Trans
}
func (a *Upload) SaveFile(ctx context.Context, file *multipart.FileHeader) (string, error) {
ext := strings.ToLower(filepath.Ext(file.Filename))
// 简单过滤危险扩展名
blacklist := []string{".exe", ".bat", ".sh", ".php", ".js"}
for _, b := range blacklist {
if ext == b {
return "", fmt.Errorf("不支持的文件类型: %s", ext)
}
}
// 确保上传目录存在
if err := os.MkdirAll(config.C.FileConfig.UploadDir, os.ModePerm); err != nil {
return "", err
}
// 构造保存路径
dstPath := filepath.Join(config.C.FileConfig.UploadDir, file.Filename)
// 打开源文件
srcFile, err := file.Open()
if err != nil {
return "", err
}
defer srcFile.Close()
// 在目标位置创建文件
outFile, err := os.Create(dstPath)
if err != nil {
return "", err
}
defer outFile.Close()
// 复制内容
if _, err := io.Copy(outFile, srcFile); err != nil {
return "", err
}
return file.Filename, nil
}