kra/internal/biz/example/file_upload.go

149 lines
3.7 KiB
Go
Raw Permalink 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 example
import (
"context"
"errors"
"mime/multipart"
"strings"
"time"
)
// FileUpload 文件上传实体
type FileUpload struct {
ID uint
Name string
ClassId int
Url string
Tag string
Key string
CreatedAt time.Time
UpdatedAt time.Time
}
// FileUploadSearchReq 文件搜索请求
type FileUploadSearchReq struct {
Page int
PageSize int
Keyword string
ClassId int
}
// OssUploader OSS上传接口与 pkg/upload.OSS 兼容)
type OssUploader interface {
UploadFile(file *multipart.FileHeader) (string, string, error)
DeleteFile(key string) error
}
// NilOssUploader 空OSS上传器用于未配置OSS时
type NilOssUploader struct{}
func (n *NilOssUploader) UploadFile(file *multipart.FileHeader) (string, string, error) {
return "", "", errors.New("OSS未配置")
}
func (n *NilOssUploader) DeleteFile(key string) error {
return errors.New("OSS未配置")
}
// FileUploadRepo 文件上传仓储接口
type FileUploadRepo interface {
Create(ctx context.Context, file *FileUpload) error
Update(ctx context.Context, file *FileUpload) error
Delete(ctx context.Context, id uint) error
FindByID(ctx context.Context, id uint) (*FileUpload, error)
FindByKey(ctx context.Context, key string) (*FileUpload, error)
List(ctx context.Context, req *FileUploadSearchReq) ([]*FileUpload, int64, error)
BatchCreate(ctx context.Context, files []*FileUpload) error
}
// FileUploadUsecase 文件上传用例
type FileUploadUsecase struct {
repo FileUploadRepo
oss OssUploader
}
// NewFileUploadUsecase 创建文件上传用例
func NewFileUploadUsecase(repo FileUploadRepo, oss OssUploader) *FileUploadUsecase {
return &FileUploadUsecase{repo: repo, oss: oss}
}
// Upload 创建文件上传记录
func (uc *FileUploadUsecase) Upload(ctx context.Context, file *FileUpload) error {
return uc.repo.Create(ctx, file)
}
// FindFile 查询文件记录
func (uc *FileUploadUsecase) FindFile(ctx context.Context, id uint) (*FileUpload, error) {
return uc.repo.FindByID(ctx, id)
}
// DeleteFile 删除文件记录
func (uc *FileUploadUsecase) DeleteFile(ctx context.Context, id uint) error {
file, err := uc.repo.FindByID(ctx, id)
if err != nil {
return err
}
// 删除OSS文件
if uc.oss != nil && file.Key != "" {
if err := uc.oss.DeleteFile(file.Key); err != nil {
return errors.New("文件删除失败")
}
}
return uc.repo.Delete(ctx, id)
}
// EditFileName 编辑文件名
func (uc *FileUploadUsecase) EditFileName(ctx context.Context, id uint, name string) error {
file, err := uc.repo.FindByID(ctx, id)
if err != nil {
return err
}
file.Name = name
return uc.repo.Update(ctx, file)
}
// GetFileRecordInfoList 分页获取文件列表
func (uc *FileUploadUsecase) GetFileRecordInfoList(ctx context.Context, req *FileUploadSearchReq) ([]*FileUpload, int64, error) {
return uc.repo.List(ctx, req)
}
// UploadFile 上传文件
func (uc *FileUploadUsecase) UploadFile(ctx context.Context, header *multipart.FileHeader, noSave string, classId int) (*FileUpload, error) {
if uc.oss == nil {
return nil, errors.New("OSS未配置")
}
filePath, key, err := uc.oss.UploadFile(header)
if err != nil {
return nil, err
}
s := strings.Split(header.Filename, ".")
file := &FileUpload{
Url: filePath,
Name: header.Filename,
ClassId: classId,
Tag: s[len(s)-1],
Key: key,
}
if noSave == "0" {
// 检查是否已存在相同key的记录
existing, _ := uc.repo.FindByKey(ctx, key)
if existing == nil {
if err := uc.repo.Create(ctx, file); err != nil {
return nil, err
}
}
}
return file, nil
}
// ImportURL 导入URL
func (uc *FileUploadUsecase) ImportURL(ctx context.Context, files []*FileUpload) error {
return uc.repo.BatchCreate(ctx, files)
}