storage.go 5.8 KB

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