b_file.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package internal
  2. import (
  3. "bytes"
  4. "context"
  5. "filesdk"
  6. "fmt"
  7. "github.com/gogf/gf/v2/os/glog"
  8. "yx-dataset-server/app/schema"
  9. "yx-dataset-server/library/logger"
  10. "yx-dataset-server/library/minio"
  11. "yx-dataset-server/library/utils"
  12. "io"
  13. "net/http"
  14. "net/url"
  15. "strings"
  16. )
  17. // NewFile 创建文件管理实例
  18. func NewFile() *File {
  19. return &File{}
  20. }
  21. // File 文件管理
  22. type File struct{}
  23. // Upload 上传文件
  24. func (a *File) Upload(ctx context.Context, r *http.Request, formKey, bucket string) (*schema.FileInfo, error) {
  25. file, header, err := r.FormFile(formKey)
  26. if err != nil {
  27. return nil, err
  28. }
  29. buff := new(bytes.Buffer)
  30. _, err = io.Copy(buff, file)
  31. if err != nil {
  32. return nil, err
  33. }
  34. headers := map[string]string{}
  35. headers["FILE-EXPIRE"] = utils.GetConfig("file_server.file-expire").String()
  36. result, err := filesdk.GetHandle().Upload(header.Filename, bucket, headers, buff.Bytes())
  37. if err != nil {
  38. glog.Debugf(ctx, "上传文件失败:%s", err.Error())
  39. return nil, err
  40. }
  41. err = filesdk.GetHandle().HandlePersistent(result.Hash)
  42. if err != nil {
  43. logger.Printf(ctx, "文件持久化设置失败:%s", err.Error())
  44. }
  45. //uuid := guid.S()
  46. //ctx = fuh.NewFileNameContext(ctx, func(ctx fuh.ContextInfo) string {
  47. // return fmt.Sprintf("%s/%s/%s/%s", ctx.BasePath(), strings.ToLower(bucket), uuid, a.getFileName(ctx.FileName()))
  48. //})
  49. //infos, err := fuh.Upload(ctx, r, formKey)
  50. //if err != nil {
  51. // return nil, err
  52. //} else if len(infos) == 0 {
  53. // return nil, nil
  54. //}
  55. //
  56. //fullName := fmt.Sprintf("%s/%s/%s/%s", utils.GetConfig("file_upload.prefix"), strings.ToLower(bucket), uuid, url.PathEscape(a.getFileName(infos[0].Name())))
  57. //if fullName[0] != '/' {
  58. // fullName = "/" + fullName
  59. //}
  60. info := &schema.FileInfo{
  61. URL: result.URL,
  62. Name: result.Name,
  63. Size: result.Size,
  64. MD5: result.Hash,
  65. }
  66. return info, nil
  67. }
  68. // Download 下载文件
  69. func (a *File) Download(ctx context.Context, fileUrl string) ([]byte, string, error) {
  70. Url, err := url.PathUnescape(fileUrl)
  71. if err != nil {
  72. return nil, "", err
  73. }
  74. stat, err := minio.GetClient().Stat(Url)
  75. if err != nil {
  76. fmt.Println("文件不存在")
  77. return nil, "", err
  78. }
  79. fileData, err := a.getSourceFileData(ctx, Url)
  80. if err != nil {
  81. return nil, "", err
  82. }
  83. return fileData, stat.ContentType, nil
  84. }
  85. func (a *File) getSourceFileData(ctx context.Context, file string) ([]byte, error) {
  86. var fileData []byte
  87. obj, err := minio.GetClient().Get(ctx, file)
  88. if err != nil {
  89. return nil, err
  90. }
  91. buf := new(bytes.Buffer)
  92. _, _ = io.Copy(buf, obj)
  93. _ = obj.Close()
  94. fileData = buf.Bytes()
  95. return fileData, nil
  96. }
  97. // 修正文件名,将半角 % 替换为全角 %(不替换的话文件将无法从浏览器中打开)
  98. func (a *File) getFileName(fileName string) string {
  99. return strings.ReplaceAll(fileName, "%", "%")
  100. }