storage.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package storage
  2. import (
  3. "dashoo.cn/opms_libary/myerrors"
  4. "dashoo.cn/opms_libary/plugin/dingtalk/base"
  5. "dashoo.cn/opms_libary/plugin/dingtalk/context"
  6. "dashoo.cn/opms_libary/utils"
  7. "encoding/json"
  8. "fmt"
  9. "io"
  10. "io/ioutil"
  11. "net/http"
  12. "os"
  13. "path/filepath"
  14. )
  15. const (
  16. AddPermissionUrl = "/v1.0/storage/spaces/%s/dentries/0/permissions" //添加权限
  17. QueryFileUploadInfoUrl = "/v1.0/storage/spaces/%s/files/uploadInfos/query" //获取文件上传信息
  18. CommitFileUploadInfoUrl = "/v1.0/storage/spaces/%s/files/commit" //提交文件
  19. )
  20. //Storage OA审批
  21. type Storage struct {
  22. base.Base
  23. }
  24. //NewStorage init
  25. func NewStorage(context *context.Context) *Storage {
  26. material := new(Storage)
  27. material.Context = context
  28. return material
  29. }
  30. //CreateSpaces 创建空间
  31. func (w *Storage) CreateSpaces(spaceId, unionId string) (response QueryFileUploadInfoResponse, err error) {
  32. optionCapabilities := &AddSpaceRequestOptionCapabilities{
  33. CanSearch: utils.Bool(true),
  34. CanRename: utils.Bool(true),
  35. CanRecordRecentFile: utils.Bool(true),
  36. }
  37. option := &AddSpaceRequestOption{
  38. Name: utils.String("OMS合同"),
  39. Capabilities: optionCapabilities,
  40. OwnerType: utils.String("APP"),
  41. }
  42. request := &AddSpaceRequest{
  43. UnionId: utils.String("8xljy04PZiS9iPxp5PhDnUzQiEiE"),
  44. Option: option,
  45. }
  46. resp, _ := w.HTTPPostJSONWithAccessToken("/v1.0/storage/spaces", request)
  47. fmt.Println(resp)
  48. return response, err
  49. }
  50. //AddPermission 添加权限
  51. func (w *Storage) AddPermission(corpId, spaceId, unionId, roleId, memType string) (response AddPermissionResponse, err error) {
  52. option := &AddPermissionRequestOption{
  53. Duration: utils.Int64(3600),
  54. }
  55. members := &AddPermissionRequestMembers{
  56. Type: utils.String(memType),
  57. Id: utils.String(unionId),
  58. CorpId: utils.String(corpId),
  59. }
  60. request := &AddPermissionRequest{
  61. UnionId: utils.String(unionId),
  62. RoleId: utils.String(roleId),
  63. Members: []*AddPermissionRequestMembers{members},
  64. Option: option,
  65. }
  66. resp, err := w.HTTPPostJSONWithAccessToken(fmt.Sprintf(AddPermissionUrl, spaceId), request)
  67. err = json.Unmarshal(resp, &response)
  68. return response, err
  69. }
  70. //QueryFileUploadInfo 获取文件上传信息
  71. func (w *Storage) QueryFileUploadInfo(spaceId, unionId string) (response QueryFileUploadInfoResponse, err error) {
  72. option := &GetFileUploadInfoRequestOption{
  73. StorageDriver: utils.String("DINGTALK"),
  74. PreferRegion: utils.String("SHANGHAI"),
  75. PreferIntranet: utils.Bool(true),
  76. }
  77. request := &GetFileUploadInfoRequest{
  78. UnionId: utils.String(unionId),
  79. Protocol: utils.String("HEADER_SIGNATURE"),
  80. Multipart: utils.Bool(false),
  81. Option: option,
  82. }
  83. resp, err := w.HTTPPostJSONWithAccessToken(fmt.Sprintf(QueryFileUploadInfoUrl, spaceId), request)
  84. err = json.Unmarshal(resp, &response)
  85. return response, err
  86. }
  87. //UploadFile 使用OSS的header加签方式上传文件息
  88. func (w *Storage) uploadFile(url string, headers map[string]string, filePath string) (code int, err error) {
  89. count := 100
  90. file, err := os.Open(filepath.Clean(filePath))
  91. if err != nil {
  92. return 0, myerrors.SysError()
  93. }
  94. defer file.Close()
  95. line, err := ioutil.ReadAll(file)
  96. pr, rw := io.Pipe()
  97. go func() {
  98. for i := 0; i < count; i++ {
  99. rw.Write(line)
  100. }
  101. rw.Close()
  102. }()
  103. // 构造request对象
  104. request, err := http.NewRequest("PUT", url, pr)
  105. for key, value := range headers {
  106. request.Header.Add(key, value)
  107. }
  108. // 提前计算出ContentLength
  109. request.ContentLength = int64(len(line) * count)
  110. resp, _ := http.DefaultClient.Do(request)
  111. return resp.StatusCode, err
  112. }
  113. //CommitFile 提交文件
  114. func (w *Storage) CommitFile(uploadKey, filename, spaceId, parentId, unionId string) (response CommitFileResponse, err error) {
  115. optionAppProperties0 := &CommitFileRequestOptionAppProperties{
  116. Name: utils.String("System"),
  117. Value: utils.String("oms"),
  118. Visibility: utils.String("PUBLIC"),
  119. }
  120. option := &CommitFileRequestOption{
  121. //Size: utils.Int64(size),
  122. ConflictStrategy: utils.String("AUTO_RENAME"),
  123. AppProperties: []*CommitFileRequestOptionAppProperties{optionAppProperties0},
  124. }
  125. request := &CommitFileRequest{
  126. UnionId: utils.String(unionId),
  127. UploadKey: utils.String(uploadKey),
  128. Name: utils.String(filename),
  129. ParentId: utils.String(parentId),
  130. Option: option,
  131. }
  132. resp, err := w.HTTPPostJSONWithAccessToken(fmt.Sprintf(CommitFileUploadInfoUrl, spaceId), request)
  133. err = json.Unmarshal(resp, &response)
  134. return response, err
  135. }
  136. func (w *Storage) UploadFile(spaceId, unionId, fileName, filePath string) (response CommitFileResponse, err error) {
  137. permResp, err := w.AddPermission(w.CorpId, spaceId, unionId, "EDITOR", "USER")
  138. if err != nil {
  139. return response, myerrors.New(500, err, err.Error())
  140. }
  141. if !permResp.Success {
  142. return response, myerrors.New(500, nil, "获取钉钉上传文件权限失败!")
  143. }
  144. infoResp, err := w.QueryFileUploadInfo(spaceId, unionId)
  145. if err != nil {
  146. return response, myerrors.New(500, err, err.Error())
  147. }
  148. uploadResp, err := w.uploadFile(infoResp.HeaderSignatureInfo.ResourceUrls[0], infoResp.HeaderSignatureInfo.Headers, filePath)
  149. if err != nil {
  150. return response, myerrors.New(500, err, err.Error())
  151. }
  152. if uploadResp != 200 {
  153. return response, myerrors.New(500, nil, "文件上传失败!")
  154. }
  155. return w.CommitFile(infoResp.UploadKey, fileName, spaceId, "0", unionId)
  156. }