| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- package storage
- import (
- "dashoo.cn/opms_libary/myerrors"
- "dashoo.cn/opms_libary/plugin/dingtalk/base"
- "dashoo.cn/opms_libary/plugin/dingtalk/context"
- "dashoo.cn/opms_libary/utils"
- "encoding/json"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "path/filepath"
- )
- const (
- AddPermissionUrl = "/v1.0/storage/spaces/%s/dentries/0/permissions" //添加权限
- QueryFileUploadInfoUrl = "/v1.0/storage/spaces/%s/files/uploadInfos/query" //获取文件上传信息
- CommitFileUploadInfoUrl = "/v1.0/storage/spaces/%s/files/commit" //提交文件
- )
- //Storage OA审批
- type Storage struct {
- base.Base
- }
- //NewStorage init
- func NewStorage(context *context.Context) *Storage {
- material := new(Storage)
- material.Context = context
- return material
- }
- //CreateSpaces 创建空间
- func (w *Storage) CreateSpaces(spaceId, unionId string) (response QueryFileUploadInfoResponse, err error) {
- optionCapabilities := &AddSpaceRequestOptionCapabilities{
- CanSearch: utils.Bool(true),
- CanRename: utils.Bool(true),
- CanRecordRecentFile: utils.Bool(true),
- }
- option := &AddSpaceRequestOption{
- Name: utils.String("OMS合同"),
- Capabilities: optionCapabilities,
- OwnerType: utils.String("APP"),
- }
- request := &AddSpaceRequest{
- UnionId: utils.String("8xljy04PZiS9iPxp5PhDnUzQiEiE"),
- Option: option,
- }
- resp, _ := w.HTTPPostJSONWithAccessToken("/v1.0/storage/spaces", request)
- fmt.Println(resp)
- return response, err
- }
- //AddPermission 添加权限
- func (w *Storage) AddPermission(corpId, spaceId, unionId, roleId, memType string) (response AddPermissionResponse, err error) {
- option := &AddPermissionRequestOption{
- Duration: utils.Int64(3600),
- }
- members := &AddPermissionRequestMembers{
- Type: utils.String(memType),
- Id: utils.String(unionId),
- CorpId: utils.String(corpId),
- }
- request := &AddPermissionRequest{
- UnionId: utils.String(unionId),
- RoleId: utils.String(roleId),
- Members: []*AddPermissionRequestMembers{members},
- Option: option,
- }
- resp, err := w.HTTPPostJSONWithAccessToken(fmt.Sprintf(AddPermissionUrl, spaceId), request)
- err = json.Unmarshal(resp, &response)
- return response, err
- }
- //QueryFileUploadInfo 获取文件上传信息
- func (w *Storage) QueryFileUploadInfo(spaceId, unionId string) (response QueryFileUploadInfoResponse, err error) {
- option := &GetFileUploadInfoRequestOption{
- StorageDriver: utils.String("DINGTALK"),
- PreferRegion: utils.String("SHANGHAI"),
- PreferIntranet: utils.Bool(true),
- }
- request := &GetFileUploadInfoRequest{
- UnionId: utils.String(unionId),
- Protocol: utils.String("HEADER_SIGNATURE"),
- Multipart: utils.Bool(false),
- Option: option,
- }
- resp, err := w.HTTPPostJSONWithAccessToken(fmt.Sprintf(QueryFileUploadInfoUrl, spaceId), request)
- err = json.Unmarshal(resp, &response)
- return response, err
- }
- //UploadFile 使用OSS的header加签方式上传文件息
- func (w *Storage) uploadFile(url string, headers map[string]string, filePath string) (code int, err error) {
- count := 100
- file, err := os.Open(filepath.Clean(filePath))
- if err != nil {
- return 0, myerrors.SysError()
- }
- defer file.Close()
- line, err := ioutil.ReadAll(file)
- pr, rw := io.Pipe()
- go func() {
- for i := 0; i < count; i++ {
- rw.Write(line)
- }
- rw.Close()
- }()
- // 构造request对象
- request, err := http.NewRequest("PUT", url, pr)
- for key, value := range headers {
- request.Header.Add(key, value)
- }
- // 提前计算出ContentLength
- request.ContentLength = int64(len(line) * count)
- resp, _ := http.DefaultClient.Do(request)
- return resp.StatusCode, err
- }
- //CommitFile 提交文件
- func (w *Storage) CommitFile(uploadKey, filename, spaceId, parentId, unionId string) (response CommitFileResponse, err error) {
- optionAppProperties0 := &CommitFileRequestOptionAppProperties{
- Name: utils.String("System"),
- Value: utils.String("oms"),
- Visibility: utils.String("PUBLIC"),
- }
- option := &CommitFileRequestOption{
- //Size: utils.Int64(size),
- ConflictStrategy: utils.String("AUTO_RENAME"),
- AppProperties: []*CommitFileRequestOptionAppProperties{optionAppProperties0},
- }
- request := &CommitFileRequest{
- UnionId: utils.String(unionId),
- UploadKey: utils.String(uploadKey),
- Name: utils.String(filename),
- ParentId: utils.String(parentId),
- Option: option,
- }
- resp, err := w.HTTPPostJSONWithAccessToken(fmt.Sprintf(CommitFileUploadInfoUrl, spaceId), request)
- err = json.Unmarshal(resp, &response)
- return response, err
- }
- func (w *Storage) UploadFile(spaceId, unionId, fileName, filePath string) (response CommitFileResponse, err error) {
- permResp, err := w.AddPermission(w.CorpId, spaceId, unionId, "EDITOR", "USER")
- if err != nil {
- return response, myerrors.New(500, err, err.Error())
- }
- if !permResp.Success {
- return response, myerrors.New(500, nil, "获取钉钉上传文件权限失败!")
- }
- infoResp, err := w.QueryFileUploadInfo(spaceId, unionId)
- if err != nil {
- return response, myerrors.New(500, err, err.Error())
- }
- uploadResp, err := w.uploadFile(infoResp.HeaderSignatureInfo.ResourceUrls[0], infoResp.HeaderSignatureInfo.Headers, filePath)
- if err != nil {
- return response, myerrors.New(500, err, err.Error())
- }
- if uploadResp != 200 {
- return response, myerrors.New(500, nil, "文件上传失败!")
- }
- return w.CommitFile(infoResp.UploadKey, fileName, spaceId, "0", unionId)
- }
|