| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package internal
- import (
- "bytes"
- "context"
- "filesdk"
- "fmt"
- "github.com/gogf/gf/v2/os/glog"
- "yx-dataset-server/app/schema"
- "yx-dataset-server/library/logger"
- "yx-dataset-server/library/minio"
- "yx-dataset-server/library/utils"
- "io"
- "net/http"
- "net/url"
- "strings"
- )
- // NewFile 创建文件管理实例
- func NewFile() *File {
- return &File{}
- }
- // File 文件管理
- type File struct{}
- // Upload 上传文件
- func (a *File) Upload(ctx context.Context, r *http.Request, formKey, bucket string) (*schema.FileInfo, error) {
- file, header, err := r.FormFile(formKey)
- if err != nil {
- return nil, err
- }
- buff := new(bytes.Buffer)
- _, err = io.Copy(buff, file)
- if err != nil {
- return nil, err
- }
- headers := map[string]string{}
- headers["FILE-EXPIRE"] = utils.GetConfig("file_server.file-expire").String()
- result, err := filesdk.GetHandle().Upload(header.Filename, bucket, headers, buff.Bytes())
- if err != nil {
- glog.Debugf(ctx, "上传文件失败:%s", err.Error())
- return nil, err
- }
- err = filesdk.GetHandle().HandlePersistent(result.Hash)
- if err != nil {
- logger.Printf(ctx, "文件持久化设置失败:%s", err.Error())
- }
- //uuid := guid.S()
- //ctx = fuh.NewFileNameContext(ctx, func(ctx fuh.ContextInfo) string {
- // return fmt.Sprintf("%s/%s/%s/%s", ctx.BasePath(), strings.ToLower(bucket), uuid, a.getFileName(ctx.FileName()))
- //})
- //infos, err := fuh.Upload(ctx, r, formKey)
- //if err != nil {
- // return nil, err
- //} else if len(infos) == 0 {
- // return nil, nil
- //}
- //
- //fullName := fmt.Sprintf("%s/%s/%s/%s", utils.GetConfig("file_upload.prefix"), strings.ToLower(bucket), uuid, url.PathEscape(a.getFileName(infos[0].Name())))
- //if fullName[0] != '/' {
- // fullName = "/" + fullName
- //}
- info := &schema.FileInfo{
- URL: result.URL,
- Name: result.Name,
- Size: result.Size,
- MD5: result.Hash,
- }
- return info, nil
- }
- // Download 下载文件
- func (a *File) Download(ctx context.Context, fileUrl string) ([]byte, string, error) {
- Url, err := url.PathUnescape(fileUrl)
- if err != nil {
- return nil, "", err
- }
- stat, err := minio.GetClient().Stat(Url)
- if err != nil {
- fmt.Println("文件不存在")
- return nil, "", err
- }
- fileData, err := a.getSourceFileData(ctx, Url)
- if err != nil {
- return nil, "", err
- }
- return fileData, stat.ContentType, nil
- }
- func (a *File) getSourceFileData(ctx context.Context, file string) ([]byte, error) {
- var fileData []byte
- obj, err := minio.GetClient().Get(ctx, file)
- if err != nil {
- return nil, err
- }
- buf := new(bytes.Buffer)
- _, _ = io.Copy(buf, obj)
- _ = obj.Close()
- fileData = buf.Bytes()
- return fileData, nil
- }
- // 修正文件名,将半角 % 替换为全角 %(不替换的话文件将无法从浏览器中打开)
- func (a *File) getFileName(fileName string) string {
- return strings.ReplaceAll(fileName, "%", "%")
- }
|