Files
web_template/internal/service/upload.go
2026-07-10 10:06:22 +00:00

55 lines
1.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"fmt"
"io"
"path/filepath"
"time"
"gotest/internal/config"
"gotest/internal/storage"
)
// UploadService 文件上传服务
type UploadService struct {
storage storage.Storage
cfg *config.Config
}
// NewUploadService 创建上传服务实例
func NewUploadService(s storage.Storage, cfg *config.Config) *UploadService {
return &UploadService{storage: s, cfg: cfg}
}
// Upload 上传文件,返回访问 URL
// filename 原始文件名(用于提取扩展名),contentType MIME 类型,fileSize 文件大小(字节),reader 文件内容流
func (s *UploadService) Upload(filename string, contentType string, fileSize int64, reader io.Reader) (string, error) {
// 校验文件大小
if fileSize > s.cfg.Upload.MaxSize {
return "", fmt.Errorf("文件大小超过限制(最大 %d 字节)", s.cfg.Upload.MaxSize)
}
// 校验文件类型
allowed := false
for _, t := range s.cfg.Upload.AllowedTypes {
if t == contentType {
allowed = true
break
}
}
if !allowed {
return "", fmt.Errorf("不支持的文件类型: %s", contentType)
}
// 生成存储 key:按日期分目录 + 时间戳文件名
ext := filepath.Ext(filename)
key := fmt.Sprintf("%s%s", time.Now().Format("2006/01/02/150405.000000"), ext)
url, err := s.storage.Upload(key, reader, contentType)
if err != nil {
return "", fmt.Errorf("文件上传失败: %w", err)
}
return url, nil
}