Files
StackChan/server/internal/service/file.go
T
2026-01-07 18:04:01 +08:00

71 lines
1.3 KiB
Go

/*
SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
SPDX-License-Identifier: MIT
*/
package service
import (
"context"
"io"
"os"
"path/filepath"
v1 "stackChan/api/file/v1"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
)
func AddFile(ctx context.Context, req *v1.FileReq) (res *v1.FileRes, err error) {
currentDir, err := os.Getwd()
if err != nil {
return nil, err
}
baseDir := "file"
fileDir := filepath.Join(currentDir, baseDir)
if req.Directory != "" {
fileDir = filepath.Join(fileDir, req.Directory)
}
if _, err := os.Stat(fileDir); os.IsNotExist(err) {
if err := os.MkdirAll(fileDir, os.ModePerm); err != nil {
return nil, err
}
}
if req.File.Size == 0 || req.Name == "" {
return nil, gerror.NewCode(gcode.CodeInvalidParameter, "file or filename is empty")
}
filePath := filepath.Join(fileDir, req.Name)
file, err := req.File.Open()
if err != nil {
return nil, err
}
fileBytes, err := io.ReadAll(file)
if err != nil {
return nil, err
}
if err := os.WriteFile(filePath, fileBytes, os.ModePerm); err != nil {
return nil, err
}
_ = file.Close()
var returnPath string
if req.Directory != "" {
returnPath = filepath.Join(baseDir, req.Directory, req.Name)
} else {
returnPath = filepath.Join(baseDir, req.Name)
}
return &v1.FileRes{
Path: returnPath,
}, nil
}