local.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package file_store
  2. import (
  3. "github.com/pkg/errors"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. )
  8. type LocalFile struct {
  9. StoragePath string
  10. }
  11. // TODO 实现本来存储文件
  12. // Setup 装载 endpoint sss
  13. func (e *LocalFile) Setup(storagePath, _, _, _ string, _ ...ClientOption) error {
  14. absolutePath, err := filepath.Abs(storagePath)
  15. if err != nil {
  16. return errors.New("获取本地文件的绝对路径失败")
  17. }
  18. e.StoragePath = absolutePath
  19. return nil
  20. }
  21. // UpLoad 上传文件
  22. func (e *LocalFile) UpLoad(yourObjectName string, localFile interface{}) error {
  23. var reader io.Reader
  24. targetPath := filepath.Join(e.StoragePath, yourObjectName)
  25. switch v := localFile.(type) {
  26. case string:
  27. // 如果是文件路径
  28. localFilePath := v
  29. absolutePath, err := filepath.Abs(localFilePath)
  30. if err != nil {
  31. return errors.Wrap(err, "获取本地文件的绝对路径失败")
  32. }
  33. file, err := os.Open(absolutePath)
  34. if err != nil {
  35. return errors.Wrap(err, "打开本地文件失败")
  36. }
  37. defer func(file *os.File) {
  38. _ = file.Close()
  39. }(file)
  40. reader = file
  41. case *os.File:
  42. // 如果是文件对象
  43. if v == nil || v.Name() == "" {
  44. return errors.New("无效的文件对象")
  45. }
  46. reader = v
  47. default:
  48. return errors.New("不支持的参数类型,必须为文件路径字符串或*os.File类型")
  49. }
  50. // 验证并创建目标路径
  51. if err := validateAndCreatePath(targetPath); err != nil {
  52. return errors.Wrap(err, "验证和创建目标路径失败")
  53. }
  54. // 创建目标文件并准备写入
  55. target, err := os.Create(targetPath)
  56. if err != nil {
  57. return errors.Wrap(err, "创建目标文件失败")
  58. }
  59. defer func(target *os.File) {
  60. _ = target.Close()
  61. }(target)
  62. // 复制文件内容到目标位置
  63. if _, err = io.Copy(target, reader); err != nil {
  64. return errors.Wrap(err, "复制文件内容到目标位置失败")
  65. }
  66. return nil
  67. }
  68. // 验证和创建目标路径
  69. func validateAndCreatePath(path string) error {
  70. dir := filepath.Dir(path)
  71. if err := os.MkdirAll(dir, 0755); err != nil && !os.IsExist(err) {
  72. return errors.Wrap(err, "创建目标文件所在父级目录失败")
  73. }
  74. return nil
  75. }
  76. // GetTempToken 获取临时Token
  77. func (e *LocalFile) GetTempToken() (string, error) {
  78. return "", nil
  79. }