55 lines
1.2 KiB
Go
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
|
|
}
|