You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ipfs_read.go 1.9 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package task
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. "time"
  8. "gitlink.org.cn/cloudream/common/pkgs/logger"
  9. )
  10. type IPFSRead struct {
  11. FileHash string
  12. LocalPath string
  13. }
  14. func NewIPFSRead(fileHash string, localPath string) *IPFSRead {
  15. return &IPFSRead{
  16. FileHash: fileHash,
  17. LocalPath: localPath,
  18. }
  19. }
  20. func (t *IPFSRead) Compare(other *Task) bool {
  21. tsk, ok := other.Body().(*IPFSRead)
  22. if !ok {
  23. return false
  24. }
  25. return t.FileHash == tsk.FileHash && t.LocalPath == tsk.LocalPath
  26. }
  27. func (t *IPFSRead) Execute(ctx TaskContext, complete CompleteFn) {
  28. log := logger.WithType[IPFSRead]("Task")
  29. log.Debugf("begin with %v", logger.FormatStruct(t))
  30. defer log.Debugf("end")
  31. outputFileDir := filepath.Dir(t.LocalPath)
  32. err := os.MkdirAll(outputFileDir, os.ModePerm)
  33. if err != nil {
  34. err := fmt.Errorf("create output file directory %s failed, err: %w", outputFileDir, err)
  35. log.WithField("LocalPath", t.LocalPath).Warn(err.Error())
  36. complete(err, CompleteOption{
  37. RemovingDelay: time.Minute,
  38. })
  39. return
  40. }
  41. outputFile, err := os.Create(t.LocalPath)
  42. if err != nil {
  43. err := fmt.Errorf("create output file %s failed, err: %w", t.LocalPath, err)
  44. log.WithField("LocalPath", t.LocalPath).Warn(err.Error())
  45. complete(err, CompleteOption{
  46. RemovingDelay: time.Minute,
  47. })
  48. return
  49. }
  50. defer outputFile.Close()
  51. rd, err := ctx.ipfs.OpenRead(t.FileHash)
  52. if err != nil {
  53. err := fmt.Errorf("read ipfs file failed, err: %w", err)
  54. log.WithField("FileHash", t.FileHash).Warn(err.Error())
  55. complete(err, CompleteOption{
  56. RemovingDelay: time.Minute,
  57. })
  58. return
  59. }
  60. _, err = io.Copy(outputFile, rd)
  61. if err != nil {
  62. err := fmt.Errorf("copy ipfs file to local file failed, err: %w", err)
  63. log.WithField("LocalPath", t.LocalPath).Warn(err.Error())
  64. complete(err, CompleteOption{
  65. RemovingDelay: time.Minute,
  66. })
  67. return
  68. }
  69. complete(nil, CompleteOption{
  70. RemovingDelay: time.Minute,
  71. })
  72. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。