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.

s2s.go 1.4 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package local
  2. import (
  3. "context"
  4. "io"
  5. "os"
  6. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  7. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
  8. cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
  9. )
  10. type S2STransfer struct {
  11. feat *cortypes.S2STransferFeature
  12. detail *clitypes.UserSpaceDetail
  13. dstPath string
  14. }
  15. // 只有同一个机器的存储之间才可以进行数据直传
  16. func (*S2STransfer) CanTransfer(src, dst *clitypes.UserSpaceDetail) bool {
  17. if types.FindFeature[*cortypes.S2STransferFeature](dst) == nil {
  18. return false
  19. }
  20. _, ok := src.UserSpace.Storage.(*cortypes.LocalType)
  21. if !ok {
  22. return false
  23. }
  24. if src.RecommendHub.HubID != dst.RecommendHub.HubID {
  25. return false
  26. }
  27. return true
  28. }
  29. // 执行数据直传
  30. func (s *S2STransfer) Transfer(ctx context.Context, src *clitypes.UserSpaceDetail, srcPath string, dstPath string) (types.FileInfo, error) {
  31. s.dstPath = dstPath
  32. copy, err := os.OpenFile(s.dstPath, os.O_WRONLY|os.O_CREATE, 0644)
  33. if err != nil {
  34. return types.FileInfo{}, err
  35. }
  36. defer copy.Close()
  37. srcFile, err := os.Open(srcPath)
  38. if err != nil {
  39. return types.FileInfo{}, err
  40. }
  41. defer srcFile.Close()
  42. n, err := io.Copy(copy, srcFile)
  43. if err != nil {
  44. return types.FileInfo{}, err
  45. }
  46. return types.FileInfo{
  47. Path: dstPath,
  48. Size: n,
  49. Hash: "",
  50. }, nil
  51. }
  52. func (s *S2STransfer) Close() {
  53. }

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