# DEMO示例

此demo将通过使用:创建空间上传文件获取文件列表下载文件等API演示如何创建文档空间、上传文档至指定空间等基本的云端文档操作。在此之前,请先理解云文档相关的概念,如“空间”、“文档”、“组织”、repo、container、workspace等。

# 服务场景描述

云文档服务通过调用创建空间上传文件获取文件列表下载文件等API完成文档上传和管理等,满足创建空间、上传文件、获取文件列表、下载文件等需求。

如果没有空间,则需要先创建一个空间;然后在此空间内进行文件操作。

# 服务调用流程

# 1.本服务调用依赖以下API:

创建空间

上传文件

获取文件列表

下载文件

可详见 空间集成示例

# 2.服务调用前置条件:

  • 创建应用,获取appkey、appsecret;

  • 获取服务调用token;

  • 开通服务,scope授权通过;

    以上步骤可参考前置准备

# 3.具体调用步骤

step1:创建空间

云文档有“空间”的概念,用来实现文档的分组。此示例中我们只创建一个空间,作为默认空间。

step2:上传文件 将本地文件上传到云文档中。

step3:获取文件列表 可以查看上传了那些文件。

step4:下载文件 将云文档的文件直接下载下来。

# 空间集成示例

# 1.RESTfull API方式

# 1. 创建空间(无限容量空间)

JsonObject json = new JsonObject();
// 空间名称
json.addProperty("name", "测试sdk创建空间222255555");
//空间类型 无限空间
json.addProperty("type","WorkspaceType.UNLIMITED.getCode()");
// 空间描述
json.addProperty("description","自测创建的空间22222111");
// 创建者ID 广联云用户ID 可以为空
json.addProperty("creatorId","6275853124802441678");
//空间的权限类型
json.addProperty("privilege","默认值为0");
String url = "https://apigate.glodon.com/gdoc/gws/v4/service/workspaces?access_token="+SERVICE_TOKEN;
res = HttpUtil.sendPost(url, json.toString(), "application/json", "Bearer " + SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10
11
12
13

# 2. 上传文件(直接流方式)

# 2.1 上传文件(根据ID)
// workspaceId为 步骤1创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// 上传到指定的父目录id下
String parentFolderFileId = "ec7dc0dab5c44daeb47a224bc73da20d";
String fileName = "textStreaming.dmg";
// 文件大小 需要本地提前计算 单位字节
Long fileLength = 100L;
// 从哪个字节开始 一般为空 表示0
Long position = null;
// 保留字段
String digest = null;
HttpHeaders headers = new HttpHeaders();
headers.setAcceptCharset(Collections.singletonList(Charset.forName("UTF-8")));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
HttpEntity<FileSystemResource> httpEntity = new HttpEntity<>(new FileSystemResource("/Users/sidney/Downloads/YoudaoNote.dmg"), headers);
String url = "https://apigate.glodon.com/gdoc/v3/doc/"+workspaceId+"/file/data?parentId="+parentFolderFileId+"&fileName="+fileName+"&size="+fileLength+"&position="+position+"&digest="+digest+"&access_token="+SERVICE_TOKEN;
res = HttpUtil.sendPost(url, httpEntity, "application/json", "Bearer " + SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.2 上传文件(根据path)
// workspaceId为 步骤1创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// parentFilePath的路径会自动补全 比如 /a/b 其中如果/a/b不存在 服务器会自动创建/a和/a/b两级目录
String parentFilePath = "/";
String fileName = "textStreaming.dmg";
// 文件大小 需要本地提前计算 单位字节
Long fileLength = 100L;
// 从哪个字节开始 一般为空 表示0
Long position = null;
// 保留字段
String digest = null;
HttpHeaders headers = new HttpHeaders();
headers.setAcceptCharset(Collections.singletonList(Charset.forName("UTF-8")));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
HttpEntity<FileSystemResource> httpEntity = new HttpEntity<>(new FileSystemResource("/Users/sidney/Downloads/YoudaoNote.dmg"), headers);
String url = "https://apigate.glodon.com/gdoc/v3/doc/"+workspaceId+"/file/data?filePath="+parentFilePath+"&fileName="+fileName
   +"&size="+fileLength+"&position="+position+"&digest="+digest+"&access_token="+SERVICE_TOKEN;
res = HttpUtil.sendPost(url, httpEntity, "application/json", "Bearer " + SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 3. 获取文件列表(支持分页、排序)

# 3.1获取文件列表(根据ID)
// workspaceId为 步骤1创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// 获取指定的父目录id下子文件列表
String parentFolderFileId = "ec7dc0dab5c44daeb47a224bc73da20d";
// SERVICE_TOKEN为前置准备 步骤3 中获取的应用token
// Integer pageIndex 第几页
// Integer pageItemCount 每页个数
// orderByType 排序字段 [NAME|TIME]
// order 排序方向 [ASC|DESC]
String url = "https://apigate.glodon.com/gdoc/v3/doc/"+workspaceId+"/file/children?fileId="+parentFolderFileId+"&pageIndex="+pageIndex +"&access_token="+SERVICE_TOKEN;
res = HttpUtil.sendGet(url, "Bearer " + SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10
11
# 3.2 获取文件列表(根据path)
// workspaceId为 步骤1创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
String parentFilePath = "/";
// SERVICE_TOKEN为前置准备 步骤3 中获取的应用token
// Integer pageIndex 第几页
// Integer pageItemCount 每页个数
// orderByType 排序字段 [NAME|TIME]
// order 排序方向 [ASC|DESC]
String url = "https://apigate.glodon.com/gdoc/v3/doc/"+workspaceId+"/file/children?filePath="+parentFilePath+"&pageIndex="+pageIndex +"&access_token="+SERVICE_TOKEN;
res = HttpUtil.sendGet(url, "Bearer " + SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10

# 4. 下载文件(外链方式)

// workspaceId为 步骤1创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// fileId为 上传成功后服务端返回的GFile.getFileId()
String fileId = "ec7dc0dab5c44daeb47a224bc73da20d"
// 此接口返回的是一个下载签名外链 GSignedFile.signedURL 可直接用于下载
String url = "https://apigate.glodon.com/gdoc/v3/doc/"+workspaceId+"/file/signedURL?fileId="
+fileId+"&access_token="+SERVICE_TOKEN;
res = HttpUtil.sendGet(url, "Bearer " + SERVICE_TOKEN);
1
2
3
4
5
6
7
8

# 2.javaSDK方式(仅限内部用户)

# 1. 引入依赖包

<!-- 请使用packages.glodon.com自动生成的settings.xml文件作作为maven设置 -->
<!-- 地址为https://packages.glodon.com/artifactory/maven-Bimface-snapshots/com/glodon/paas/foundation/${artifactId}/ -->
<!-- gdoc -->
<dependency>
    <groupId>com.glodon.paas.foundation</groupId>
    <artifactId>gdoc-java-sdk</artifactId>
    <version>1.8.6-SNAPSHOT</version>
</dependency>
<!-- gws -->
<dependency>
    <groupId>com.glodon.paas.foundation</groupId>
    <artifactId>gws-java-sdk</artifactId>
    <version>1.2.1-SNAPSHOT</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 2. 创建空间(无限容量空间)

String apiBaseDomain = "https://apigate.glodon.com/gdoc/";
GWSServiceClient gwsServiceClient = new GWSServiceClient(apiBaseDomain);
WorkspaceCreationReq req = new WorkspaceCreationReq();
// 空间名称
req.setName("测试sdk创建空间222255555");
// 空间描述
req.setDescription("自测创建的空间22222111");
// 无限空间
req.setType(WorkspaceType.UNLIMITED.getCode());
 // 创建者ID 广联云用户ID 可以为空
req.setCreatorId("6275853124802441678");
// SERVICE_TOKEN为前置准备 步骤3 中获取的应用token
WorkspaceBasicInfoResp workspace = gwsServiceClient.createWorkspace(req, SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3. 上传文件(直接流方式)

String apiBaseDomain = "https://apigate.glodon.com/gdoc/";
GDocServiceClient client = new GDocServiceClient(apiBaseDomain);
String localFilePath = "/Users/sidney/Downloads/YoudaoNote.dmg";
InputStream fio = new FileInputStream(localFilePath);
// workspaceId为 步骤2创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// 上传到指定的父目录id下
String parentFolderFileId = "ec7dc0dab5c44daeb47a224bc73da20d";
String fileName = "textStreaming.dmg";
// parentFilePath和parentFolderFileId二选一
// parentFilePath的路径会自动补全 比如 /a/b 其中如果/a/b不存在 服务器会自动创建/a和/a/b两级目录
String parentFilePath = "/";
// 文件大小 需要本地提前计算 单位字节
Long fileLength = 100L;
// 从哪个字节开始 一般为空 表示0
Long position = null;
// 保留字段
String digest = null;
// SERVICE_TOKEN为前置准备 步骤3 中获取的应用token
GFile gFile = client.uploadFile(fio, workspaceId,
                parentFolderFileId, fileName,
                parentFilePath, fileLength, position, digest, SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 4. 获取文件列表(支持分页、排序)

String apiBaseDomain = "https://apigate.glodon.com/gdoc/";
GDocServiceClient client = new GDocServiceClient(apiBaseDomain);
// workspaceId为 步骤2创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// 获取指定的父目录id下子文件列表
String parentFolderFileId = "ec7dc0dab5c44daeb47a224bc73da20d";
// parentFilePath和parentFolderFileId二选一
String parentFilePath = "/";
// SERVICE_TOKEN为前置准备 步骤3 中获取的应用token
// Integer pageIndex 第几页
// Integer pageItemCount 每页个数
// orderByType 排序字段 [NAME|TIME]
// order 排序方向 [ASC|DESC]
Pagination<GFile> respData = client.queryFileChildrenByPagination(workspaceId,
                parentFolderFileId, parentFilePath, pageIndex, pageItemCount, orderByType, order, SERVICE_TOKEN);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 5. 下载文件(外链方式)

String apiBaseDomain = "https://apigate.glodon.com/gdoc/";
GDocServiceClient client = new GDocServiceClient(apiBaseDomain);
// workspaceId为 步骤2创建空间 返回值中的 WorkspaceBasicInfoResp.getId()
String workspaceId = "ec7dc0dab5c44daeb47a224bc73da20d";
// fileId为 上传成功后服务端返回的GFile.getFileId()
String fileId = "ec7dc0dab5c44daeb47a224bc73da20d"
// 此接口返回的是一个下载签名外链 GSignedFile.signedURL 可直接用于下载
GSignedFile data = client.getSignedDownloadUrl(workspaceId,
                fileId, null, SERVICE_TOKEN);
1
2
3
4
5
6
7
8
9

# 演示代码(仅限于SDK方式)

说明:SDK方式目前只支持广联达集团内部用户

# 1.java-demo 示例

使用已封装好的gdoc-java-sdk、gws-java-sdk访问gdoc功能,使用account-ext-core用来获取token。

主要依赖如下

        <!--        gdoc功能        -->
        <dependency>
            <groupId>com.glodon.paas.foundation</groupId>
            <artifactId>gws-java-sdk</artifactId>
            <version>1.2.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <artifactId>okio</artifactId>
                    <groupId>com.squareup.okio</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <artifactId>okio</artifactId>
            <groupId>com.squareup.okio</groupId>
            <version>${okio.version}</version>
        </dependency>
        <dependency>
            <groupId>com.glodon.paas.foundation</groupId>
            <artifactId>gdoc-java-sdk</artifactId>
            <version>1.8.6-SNAPSHOT</version>
        </dependency>

        <!--        用来获取token        -->
        <dependency>
            <artifactId>account-ext-core</artifactId>
            <groupId>com.glodon.paas.foundation</groupId>
            <version>0.0.9-SNAPSHOT</version>
        </dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

本演示的pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <okio.version>1.17.2</okio.version>
    </properties>

    <dependencies>
        <!--        gdoc功能        -->
        <dependency>
            <groupId>com.glodon.paas.foundation</groupId>
            <artifactId>gws-java-sdk</artifactId>
            <version>1.2.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <artifactId>okio</artifactId>
                    <groupId>com.squareup.okio</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <artifactId>okio</artifactId>
            <groupId>com.squareup.okio</groupId>
            <version>${okio.version}</version>
        </dependency>
        <dependency>
            <groupId>com.glodon.paas.foundation</groupId>
            <artifactId>gdoc-java-sdk</artifactId>
            <version>1.8.6-SNAPSHOT</version>
        </dependency>

        <!--        用来获取token        -->
        <dependency>
            <artifactId>account-ext-core</artifactId>
            <groupId>com.glodon.paas.foundation</groupId>
            <version>0.0.9-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.7</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

配置application.yml

application:
  app-key: #您创建的应用的appKey
  app-secret: #您创建的应用的appSecret
  account-url: https://account.glodon.com/
  apigate-url: https://apigate.glodon.com/gdoc/
  workspace-id: # 一般提前创建好
1
2
3
4
5
6

开始使用(以Java SDK为例)

package com.example.demo;

import com.glodon.paas.document.bean.GFile;
import com.glodon.paas.document.bean.GSignedFile;
import com.glodon.paas.document.bean.SignedUrlBehavior;
import com.glodon.paas.document.bean.SignedUrlType;
import com.glodon.paas.foundation.accountCore.AccountConfiguration;
import com.glodon.paas.foundation.accountCore.AccountService;
import com.glodon.paas.foundation.accountCore.service.AccountServiceImpl;
import com.glodon.paas.foundation.sdk.gdoc.GDocServiceClient;
import com.glodon.paas.foundation.sdk.gws.GWSServiceClient;
import com.glodon.paas.gws.bean.WorkspaceCreationReq;
import com.glodon.paas.gws.oauth2.resp.WorkspaceBasicInfoResp;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.InputStream;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
    @Value("${application.app-key}")
    private String appKey;

    @Value("${application.app-secret}")
    private String appSecret;

    @Value("${application.account-url}")
    private String accountUrl;

    @Value("${application.apigate-url}")
    private String apigatetUrl;

    @Value("${application.workspace-id}")
    private String workspaceId;

    @Bean
    AccountService accountService() {
        return new AccountServiceImpl(new AccountConfiguration(null, appKey, appSecret, accountUrl, false));
    }

    @Override
    public void run(String... args) throws Exception {
        String accessToken = accountService().getServiceToken().getAccessToken();
        // 1 workspaceId 应提前创建好,此处为了演示,临时创建
        if (StringUtils.isEmpty(workspaceId)) {
            workspaceId = createWorkspace("test", accessToken);
        }
        System.out.println("workspaceId is " + workspaceId);

        GDocServiceClient client = new GDocServiceClient(apigatetUrl);
        File file = new File("E:\\a.zip");
        String containerId = workspaceId;
        String parentId = null;
        String fileName = null;
        String filePath = "mypath/" + file.getName();
        Long size = file.length();
        Long position = null;
        String digest = null;
        // 2 上传文件
        GFile gfile = client.uploadFile(file, containerId, parentId, fileName, filePath, size, position, digest, accessToken);
        String fileId = gfile.getFileId();
        System.out.println("upload fileId is " + fileId);
        // 3 下载文件
        String loaclFile = "E:\\f.zip";
        InputStream is = client.downloadFileByFileId(containerId, fileId, null, accessToken);
        FileUtils.copyInputStreamToFile(is, new File(loaclFile));
        System.out.println("download to " + loaclFile);
        // 4 分享链接
        Integer versionIndex = null;
        SignedUrlType type = SignedUrlType.PUBLIC;
        SignedUrlBehavior behavior = SignedUrlBehavior.DOWNLOAD;
        Integer lease = 60; // 这个指过期时间
        GSignedFile gSignedFile = client.getSignedURLByFileId(workspaceId, fileId, versionIndex, type, behavior, lease, accessToken);
        String url = gSignedFile.getSignedURL();
        System.out.println("signed url is " + url);

    }

    private String createWorkspace(String name, String accessToken) {
        GWSServiceClient client = new GWSServiceClient();
        WorkspaceCreationReq workspaceCreationReq = new WorkspaceCreationReq();
        workspaceCreationReq.setName("name");
        workspaceCreationReq.setType(new Byte((byte) 2));
        workspaceCreationReq.setPrivilegeType(0);
        WorkspaceBasicInfoResp workspaceBasicInfoResp = client.createWorkspace(workspaceCreationReq, accessToken);
        return workspaceBasicInfoResp.getId();
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

# 2.python-demo 示例

# 对demo中涉及到的api进行封装
# gdocclient_sdk_python.py
import requests
import base64
import json
import time
import os
import logging
import traceback
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')

logger = logging.getLogger('GDocClient')

class GDocClient:
    def __init__(self, appKey, appSecret, workspaceId, accountServer = "https://account.glodon.com", apigateServer = "https://apigate.glodon.com"):
        self._accountUrl = accountServer + "/oauth2/token?grant_type=client_credentials"
        self._apigateUrl = apigateServer
        self._fileDataUrl = self._apigateUrl + '/gdoc/v3/doc/{}/file/data'
        self._fileWorkspaceUrl = self._apigateUrl + '/gdoc/gws/v4/service/workspaces'
        self._signedUrl = self._apigateUrl + '/gdoc/v3/doc/{}/file/signedURL?fileId={}&lease={}'
        k = appKey + ':' + appSecret
        self._basicAuth = base64.b64encode(k.encode()).decode()
        self._accessToken = None
        self._expiredIn = None
        self._accessTokenStartTime = None
        self._workspaceId = workspaceId

    def _checkToken(self):
        if self._accessToken == None:            
            r = requests.post(self._accountUrl, headers={'Authorization': 'Basic ' + self._basicAuth})
            data = json.loads(r.text)
            logger.info("_checkToken -> %s", data)
            if r.status_code == 200:
                self._accessToken = data['access_token']
                self._expiredIn = data['expires_in']
                self._accessTokenStartTime = time.time()
            else:
                raise Exception('check token fail {}' % r.text)
        return self._accessToken != None

    def setWorkspaceId(self, workspaceId):
        self._workspaceId = workspaceId

    def createWorkspace(self, name):
        r"""创建空间.

        :param name: 空间名称.
        :return: id 空间id
        :rtype: string
        """

        if self._checkToken():
            url = self._fileWorkspaceUrl
            data = {
                "name": name,
                "type": "2",
                "privilegeType": "0"
            }
            r = requests.post(url, headers={'Authorization': 'Bearer ' + self._accessToken, 'Content-Type':'application/json'}, data=json.dumps(data))
            data = json.loads(r.text)
            logger.info("createWorkspace -> %s", data)
            if r.status_code == 200 and data['code'] == 0:
                return data['data']['id']
            else:
                raise Exception('createWorkspace fail {}' % data)


    def upload(self, localFile, fileParentPath = None):
        r"""上传文件.

        :param localFile: 本地文件路径.
        :param fileParentPath: 服务器文件夹.
        :return: fileId 上传后的云端文件id
        :rtype: string
        """
        if self._workspaceId == None:
            raise Exception('you should create container first')
        if self._checkToken():
            fsize = os.path.getsize(localFile)
            path = os.path.basename(localFile) if fileParentPath == None else fileParentPath + '/' + os.path.basename(localFile)
            url = self._fileDataUrl.format(self._workspaceId) + '?filePath={}&size={}'.format(path, fsize)
            files = {'name': open(localFile, 'rb')}
            r = requests.post(url, headers={'Authorization': 'Bearer ' + self._accessToken}, files=files)
            data = json.loads(r.text)
            logger.info("upload -> %s", data)
            if r.status_code == 200 and data['code'] == 0:
                return data['data']['fileId']
            else:
                raise Exception('upload fail {}'.format(data))


    def getSignedUrl(self, fileId, expiresIn):
        r"""获取下载链接.

        :param fileId: 云端文件id.
        :param expiresIn: 有效期(秒).
        :return: url 下载链接
        :rtype: string
        """
        if self._workspaceId == None:
            raise Exception('you should create container first')
        if self._checkToken():
            url = self._signedUrl.format(self._workspaceId, fileId, expiresIn)
            r = requests.get(url, headers={'Authorization': 'Bearer ' + self._accessToken})
            data = json.loads(r.text)
            logger.info("getSignedUrl -> %s", data)
            if r.status_code == 200 and data['code'] == 0:
                return data['data']['signedURL']
            else:
                raise Exception('getSignedUrl fail {}'.format(data))

    def download(self, fileId, saveToFile):
        r"""下载文件.

        :param fileId: 云端文件id.
        :param saveToFile: 保存到本地文件.
        :return: 
        :rtype: string
        """
        if self._workspaceId == None:
            raise Exception('you should create container first')
        if self._checkToken():
            url = self._fileDataUrl.format(self._workspaceId) + '?fileId={}'.format(fileId)
            r = requests.get(url, headers={'Authorization': 'Bearer ' + self._accessToken})
            if r.status_code != 200:
                raise Exception('download fail {}'.format(r.text))
            logger.info("download -> %s", saveToFile)
            with open(saveToFile, "wb") as infile:
                infile.write(r.content)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130

开始使用

from gdocclient_sdk_python.py import GDocClient

app_key = #您创建的应用的appKey
app_secret = #您创建的应用的appSecret

f = "E:\\a.zip"
client = GDocClient(app_key, app_secret, None)
# 1 通常workspace只创建一次,保留此workspaceId使用
workspaceId = client.createWorkspace("test")
print("workspaceId --> ", workspaceId)
client.setWorkspaceId(workspaceId)
# 2 上传文件
fileId = client.upload(f)
print("fileId --> ", fileId)
# 3 生成分享链接
url = client.getSignedUrl(fileId, 60)
print("url --> ", url)
# 4 直接下载文件
client.download(fileId, "E:\\c.zip")
print("done --> ")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 在线客服

  • 意见反馈