Skip to content

Commit

Permalink
文件上传接口参数新增可自定义的 file_name 字段
Browse files Browse the repository at this point in the history
  • Loading branch information
chenmingyong0423 committed Jan 17, 2024
1 parent 9ee0bc1 commit d5a8e5c
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 12 deletions.
12 changes: 7 additions & 5 deletions server/internal/file/handler/file_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ func (h *FileHandler) RegisterGinRoutes(engine *gin.Engine) {
}

func (h *FileHandler) UploadFile(ctx *gin.Context) (VO vo.FileVO, err error) {
fileName := ctx.PostForm("file_name")
file, err := ctx.FormFile("file")
if err != nil {
return
Expand All @@ -57,11 +58,12 @@ func (h *FileHandler) UploadFile(ctx *gin.Context) (VO vo.FileVO, err error) {
return
}
fileDto := dto.FileDTO{
FileName: file.Filename,
FileSize: file.Size,
Content: content,
FileType: file.Header.Get("Content-Type"),
FileExt: filepath.Ext(file.Filename),
FileName: file.Filename,
FileSize: file.Size,
Content: content,
FileType: file.Header.Get("Content-Type"),
FileExt: filepath.Ext(file.Filename),
CustomFileName: fileName,
}
fileInfo, err := h.serv.Upload(ctx, fileDto)
if err != nil {
Expand Down
7 changes: 7 additions & 0 deletions server/internal/file/repository/dao/file_dao.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import (
"fmt"
"time"

"github.com/chenmingyong0423/go-mongox/builder/query"

"github.com/pkg/errors"

"github.com/chenmingyong0423/go-mongox/bsonx"
Expand Down Expand Up @@ -59,6 +61,7 @@ type IFileDao interface {
Save(ctx context.Context, file *File) (string, error)
PushIntoUsedIn(ctx context.Context, fileId []byte, fileUsage FileUsage) error
PullUsedIn(ctx context.Context, fileId []byte, fileUsage FileUsage) error
FindByFileName(ctx context.Context, filename string) (*File, error)
}

var _ IFileDao = (*FileDao)(nil)
Expand All @@ -71,6 +74,10 @@ type FileDao struct {
coll *mongox.Collection[File]
}

func (d *FileDao) FindByFileName(ctx context.Context, filename string) (*File, error) {
return d.coll.Finder().Filter(query.Eq("file_name", filename)).FindOne(ctx)
}

func (d *FileDao) PullUsedIn(ctx context.Context, fileId []byte, fileUsage FileUsage) error {
updateOne, err := d.coll.Updater().Filter(bsonx.M("file_id", fileId)).Updates(update.BsonBuilder().Pull("used_in", fileUsage).Set("update_time", time.Now().Unix()).Build()).UpdateOne(ctx)
if err != nil {
Expand Down
34 changes: 34 additions & 0 deletions server/internal/file/repository/file_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type IFileRepository interface {
Save(ctx context.Context, file *domain.File) error
PushIntoUsedIn(ctx context.Context, fileId []byte, entityId string, entityType string) error
PullUsedIn(ctx context.Context, fileId []byte, entityId string, entityType string) error
FindByFileName(ctx context.Context, filename string) (*domain.File, error)
}

var _ IFileRepository = (*FileRepository)(nil)
Expand All @@ -40,6 +41,14 @@ type FileRepository struct {
dao dao.IFileDao
}

func (r *FileRepository) FindByFileName(ctx context.Context, filename string) (*domain.File, error) {
file, err := r.dao.FindByFileName(ctx, filename)
if err != nil {
return nil, err
}
return r.toDomainFile(file), nil
}

func (r *FileRepository) PullUsedIn(ctx context.Context, fileId []byte, entityId string, entityType string) error {
return r.dao.PullUsedIn(ctx, fileId, dao.FileUsage{
EntityId: entityId,
Expand Down Expand Up @@ -78,3 +87,28 @@ func (r *FileRepository) Save(ctx context.Context, file *domain.File) error {
}
return nil
}

func (r *FileRepository) toDomainFile(file *dao.File) *domain.File {
return &domain.File{
Id: file.Id.Hex(),
FileId: hex.EncodeToString(file.FileId),
FileName: file.FileName,
OriginalFileName: file.OriginalFileName,
FileType: file.FileType,
FileSize: file.FileSize,
FilePath: file.FilePath,
Url: file.Url,
UsedIn: func() []domain.FileUsage {
usedIn := make([]domain.FileUsage, 0)
for _, usage := range file.UsedIn {
usedIn = append(usedIn, domain.FileUsage{
EntityId: usage.EntityId,
EntityType: string(usage.EntityType),
})
}
return usedIn
}(),
CreateTime: file.CreateTime,
UpdateTime: file.UpdateTime,
}
}
24 changes: 22 additions & 2 deletions server/internal/file/service/file_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,13 @@ package service

import (
"context"
"net/http"
"os"

"github.com/chenmingyong0423/fnote/server/internal/pkg/api"
"github.com/pkg/errors"
"go.mongodb.org/mongo-driver/mongo"

"github.com/spf13/viper"

"github.com/chenmingyong0423/fnote/server/internal/pkg/domain"
Expand Down Expand Up @@ -54,8 +59,23 @@ func (s *FileService) IndexFileMeta(ctx context.Context, fileId []byte, entityId
}

func (s *FileService) Upload(ctx context.Context, fileDTO dto.FileDTO) (*domain.File, error) {
fileId := uuidx.RearrangeUUID4()
filename := fileId + fileDTO.FileExt
var (
filename, fileId string
)
if fileDTO.CustomFileName != "" {
filename = fileDTO.CustomFileName + fileDTO.FileExt
file, err := s.repo.FindByFileName(ctx, filename)
if err != nil && !errors.Is(err, mongo.ErrNoDocuments) {
return nil, err
}
if file != nil {
return nil, api.NewErrorResponseBody(http.StatusConflict, "file already exists")
}
} else {
fileId = uuidx.RearrangeUUID4()
filename = fileId + fileDTO.FileExt
}

staticPath := viper.GetString("system.static_path")
err := os.MkdirAll(staticPath, os.ModePerm)
if err != nil {
Expand Down
11 changes: 6 additions & 5 deletions server/internal/pkg/web/dto/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@
package dto

type FileDTO struct {
FileName string `json:"file_name"`
FileSize int64 `json:"file_size"`
Content []byte `json:"content"`
FileType string `json:"file_type"`
FileExt string `json:"file_ext"`
FileName string `json:"file_name"`
FileSize int64 `json:"file_size"`
Content []byte `json:"content"`
FileType string `json:"file_type"`
FileExt string `json:"file_ext"`
CustomFileName string
}

0 comments on commit d5a8e5c

Please sign in to comment.