Skip to content

Commit df4b022

Browse files
author
davis.zheng
committed
添加go-sdk和c-sdk
1 parent 2fe1fb5 commit df4b022

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+4170
-19
lines changed

_config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,5 +231,9 @@ plugins:
231231

232232
collections_dir: collections
233233
collections:
234+
go-sdk:
235+
output: true
234236
python-sdk:
237+
output: true
238+
c-sdk:
235239
output: true

_data/navigation.yml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,59 @@ header:
4949
# @end locale config
5050
url: /about.html
5151

52+
go-sdk:
53+
- title: Go-SDK
54+
children:
55+
- title: 概述
56+
url: /go-sdk/概述.html
57+
- title: 快速使用
58+
url: /go-sdk/快速使用.html
59+
- title: 初始化请求
60+
url: /go-sdk/初始化请求.html
61+
- title: 存储空间管理
62+
url: /go-sdk/存储空间管理.html
63+
- title: 文件上传
64+
children:
65+
- title: 简单上传
66+
url: /go-sdk/简单上传.html
67+
- title: 表单上传
68+
url: /go-sdk/表单上传.html
69+
- title: 流式上传
70+
url: /go-sdk/流式上传.html
71+
- title: 秒传
72+
url: /go-sdk/秒传.html
73+
- title: 分片上传
74+
url: /go-sdk/分片上传.html
75+
- title: 指定存储类型上传
76+
url: /go-sdk/指定存储类型上传.html
77+
- title: 上传回调
78+
url: /go-sdk/上传回调.html
79+
80+
- title: 文件管理
81+
children:
82+
- title: 比较本地文件和远程文件etag
83+
url: /go-sdk/比较本地文件和远程文件etag.html
84+
- title: 存储类型转换
85+
url: /go-sdk/存储类型转换.html
86+
- title: 获取文件基本信息
87+
url: /go-sdk/获取文件基本信息.html
88+
- title: 前缀列表查询
89+
url: /go-sdk/前缀列表查询.html
90+
- title: 获取目录文件列表
91+
url: /go-sdk/获取目录文件列表.html
92+
- title: 文件下载
93+
url: /go-sdk/文件下载.html
94+
- title: 文件删除
95+
url: /go-sdk/文件删除.html
96+
- title: 文件拷贝
97+
url: /go-sdk/文件拷贝.html
98+
- title: 文件重命名
99+
url: /go-sdk/文件重命名.html
100+
- title: 文件解冻
101+
url: /go-sdk/文件解冻.html
102+
- title: ARM 机器编译 Go SDK
103+
url: /go-sdk/ARM 机器编译 Go SDK.html
104+
52105
python-sdk:
53106
- title: Python-SDK
54107
children:
@@ -107,3 +160,34 @@ python-sdk:
107160
url: /python-sdk/拷贝文件.html
108161
- title: 重命名文件
109162
url: /python-sdk/重命名文件.html
163+
164+
c-sdk:
165+
- title: C-SDK
166+
children:
167+
- title: 概述
168+
url: /c-sdk/概述.html
169+
- title: 快速使用
170+
url: /c-sdk/快速使用.html
171+
- title: 初始化请求
172+
url: /c-sdk/初始化请求.html
173+
- title: 存储空间管理
174+
url: /c-sdk/存储空间管理.html
175+
- title: 文件上传
176+
children:
177+
- title: 简单上传
178+
url: /c-sdk/简单上传.html
179+
- title: 缓存上传
180+
url: /c-sdk/缓存上传.html
181+
- title: 分片上传
182+
url: /c-sdk/分片上传.html
183+
184+
- title: 文件管理
185+
children:
186+
- title: 获取文件基本信息
187+
url: /c-sdk/获取文件基本信息.html
188+
- title: 简单下载
189+
url: /c-sdk/简单下载.html
190+
- title: 分片下载
191+
url: /c-sdk/分片下载.html
192+
- title: 删除文件
193+
url: /c-sdk/删除文件.html

_sass/common/_variables.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ $layout: (
8484
content-max-width: 950px,
8585
sidebar-width: 250px,
8686
sidebar-header-height: 3rem,
87-
aside-width: 220px
87+
aside-width: 280px
8888
);
8989

9090
// sm md lg

_sass/common/components/_toc.scss

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,7 @@ ul.toc {
7777

7878
// 右侧侧边栏-文章目录
7979
ul.toc--ellipsis {
80-
& > li {
81-
@include overflow(hidden);
82-
text-overflow: ellipsis;
83-
white-space: nowrap;
84-
}
80+
8581
.toc-h1 {
8682
&, a {
8783
font-size:1rem;
@@ -90,13 +86,13 @@ ul.toc--ellipsis {
9086
}
9187
.toc-h2 {
9288
&, a {
93-
font-size:.9rem;
89+
font-size:.95rem;
9490

9591
}
9692
}
9793
.toc-h3 {
9894
&, a {
99-
font-size:.8rem;
95+
font-size:.85rem;
10096

10197
}
10298
}

collections/_c-sdk/分片上传.md

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
---
2+
catalog: true
3+
title: '分片上传'
4+
sidebar:
5+
nav: c-sdk
6+
7+
---
8+
9+
10+
11+
本 SDK 提供了分片上传(Multipart Upload)功能,可以将要上传的文件分成多个数据块(US3 里又称之为 Part)来分别上传,适用于大文件。
12+
13+
## 分片上传流程
14+
15+
在US3中,一个完整的分片上传分为**初始化分片 -> 上传分片 -> 完成分片(放弃分片)**三个阶段。本SDK提供的相应方法如下,完整代码详见 [Github](https://github.com/ufilesdk-dev/ufile-csdk/blob/master/lib/ufile_mput.c)
16+
17+
| 方法名 | 说明 |
18+
| :--------------------------- | :----------------------------------------------------------- |
19+
| ufile_multiple_upload_init | 初始化分片上传,US3 API 文档详见 [InitiateMultipartUpload](https://docs.ucloud.cn/api/ufile-api/initiate_multipart_upload) |
20+
| ufile_multiple_upload_part | 上传一个分片,US3 API 文档详见 [UploadPart](https://docs.ucloud.cn/api/ufile-api/upload_part) |
21+
| ufile_multiple_upload_finish | 终止分片上传,US3 API 文档详见 [AbortMultipartUpload](https://docs.ucloud.cn/api/ufile-api/abort_multipart_upload) |
22+
| ufile_multiple_upload_abort | 完成分片上传,US3 API 文档详见 [FinishMultipartUpload](https://docs.ucloud.cn/api/ufile-api/finish_multipart_upload) |
23+
24+
目前SDK提供同步分片上传和异步并发分片上传两种方式,示例如下。
25+
26+
## 同步分片上传
27+
28+
注意,当前SDK并未直接提供同步分片上传方法供外部调用,若使用同步分片上传请参照示例实现。如有疑问,可到[Github](https://github.com/ufilesdk-dev/ufile-csdk/issues)上提交issue或[联系我们](https://spt.ucloud.cn/)
29+
30+
### 示例
31+
32+
> 执行该示例请先配置`UFILE_*`相关环境变量并赋予`bucket_name``key``mime_type``file_path`有效值。
33+
34+
<div class="copyable" markdown="1">
35+
36+
```c
37+
#include "../lib/api.h"
38+
#include <stdio.h>
39+
#include <stdlib.h>
40+
41+
const char* bucket_name = "your bucket name";
42+
const char* key = "your file key";
43+
const char* file_path = "your local file to be uploaded";
44+
const char* mime_type = "your file type";
45+
46+
int main(int argc, char *argv[]){
47+
// 读取配置初始化SDK
48+
struct ufile_config cfg;
49+
cfg.public_key = getenv("UFILE_PUBLIC_KEY");
50+
cfg.private_key = getenv("UFILE_PRIVATE_KEY");
51+
cfg.bucket_host = getenv("UFILE_BUCKET_HOST");
52+
cfg.file_host = getenv("UFILE_FILE_HOST");
53+
struct ufile_error error;
54+
error = ufile_sdk_initialize(cfg, 0);
55+
if(UFILE_HAS_ERROR(error.code)){
56+
printf("初始化 sdk 失败,错误信息为:%s\n", error.message);
57+
return 1;
58+
}
59+
60+
// 初始化分片
61+
struct ufile_mutipart_state state;
62+
error = ufile_multiple_upload_init(&state, bucket_name, key, mime_type);
63+
if(UFILE_HAS_ERROR(error.code)){
64+
ufile_sdk_cleanup();
65+
printf("调用 ufile_multiple_upload_init 失败,错误信息为:%d, %s\n", error.code, error.message);
66+
return 1;
67+
}
68+
69+
FILE *fp = fopen(file_path, "rb");
70+
if (fp == NULL){
71+
fprintf(stderr, "打开文件失败, 错误信息为: %s\n", strerror(errno));
72+
return 1;
73+
}
74+
75+
// 上传分片
76+
char *buf = malloc(state.part_size);
77+
for(int i=0; ; i++){
78+
size_t nc = fread(buf, 1, state.part_size, fp);
79+
if(nc == 0){ // 为0即读到文件尾,分片已上传完毕
80+
break;
81+
}
82+
error = ufile_multiple_upload_part(&state, buf, nc, i);
83+
if(UFILE_HAS_ERROR(error.code)){
84+
printf("调用 ufile_multiple_upload_part 失败,错误信息为:%d, %s\n", error.code, error.message);
85+
// 分片上传出错,放弃分片
86+
ufile_multiple_upload_abort(&state);
87+
ufile_sdk_cleanup();
88+
return 1;
89+
}
90+
}
91+
92+
// 完成分片上传
93+
printf("调用 ufile_multiple_upload_finish 完成分片上传\n");
94+
error = ufile_multiple_upload_finish(&state);
95+
if(UFILE_HAS_ERROR(error.code)){
96+
printf("调用 ufile_multiple_upload_finish 失败,错误信息为:%s\n", error.message);
97+
}
98+
// 释放初始化SDK时分配的内存
99+
ufile_sdk_cleanup();
100+
return 0;
101+
}
102+
```
103+
</div>
104+
105+
## 异步并发分片上传
106+
107+
注意,当前SDK的异步并发上传功能仅做测试使用,不包含在sdk模块中。线程池模块完整代码请详见[Github](https://github.com/ufilesdk-dev/ufile-csdk/blob/master/lib/thpool.c)。若要使用异步并发分片上传请参照以下示例。如有疑问,可到[Github](https://github.com/ufilesdk-dev/ufile-csdk/issues)上提交issue或[联系我们](https://spt.ucloud.cn/);
108+
109+
### 示例
110+
111+
> 执行该示例请先配置`UFILE_*`相关环境变量并赋予`bucket_name`、`key`、`mime_type`和`file_path`有效值。
112+
113+
<div class="copyable" markdown="1">
114+
115+
```c
116+
#include "../lib/api.h"
117+
#include <stdio.h>
118+
#include <stdlib.h>
119+
#include <errno.h>
120+
#include <string.h>
121+
#include "thpool.h" //线程池模块,仅做为测试用,不包含在sdk模块中。
122+
123+
const char* bucket_name = "your bucket name";
124+
const char* key = "your file key";
125+
const char* file_path = "your local file to be uploaded";
126+
const char* mime_type = "your file type";
127+
const int jobs = 5;
128+
129+
struct part_data{
130+
struct ufile_mutipart_state *state;
131+
char *buf;
132+
size_t buf_len;
133+
int pos;
134+
};
135+
136+
// 线程的分片上传任务,param为分片数据
137+
void upload_task(void *param){
138+
struct part_data *part = (struct part_data*)param;
139+
struct ufile_error error;
140+
error = ufile_multiple_upload_part(part->state, part->buf, part->buf_len, part->pos);
141+
if(UFILE_HAS_ERROR(error.code)){
142+
printf("调用 upload 失败,错误信息为:%s\n", error.message);
143+
ufile_multiple_upload_abort(part->state); // 某一分片上传失败,则放弃分片上传
144+
exit(1); //某一分片上传失败,放弃分片上传后直接退出程序。
145+
}
146+
free(part->buf);
147+
free(part);
148+
}
149+
150+
151+
int main(int argc, char *argv[]){
152+
// 读取配置初始化SDK
153+
struct ufile_config cfg;
154+
cfg.public_key = getenv("UFILE_PUBLIC_KEY");
155+
cfg.private_key = getenv("UFILE_PRIVATE_KEY");
156+
cfg.bucket_host = getenv("UFILE_BUCKET_HOST");
157+
cfg.file_host = getenv("UFILE_FILE_HOST");
158+
struct ufile_error error;
159+
error = ufile_sdk_initialize(cfg, 0);
160+
if(UFILE_HAS_ERROR(error.code)){
161+
printf("初始化 sdk 失败,错误信息为:%s\n", error.message);
162+
return 1;
163+
}
164+
165+
// 初始化分片
166+
struct ufile_mutipart_state state;
167+
error = ufile_multiple_upload_init(&state, bucket_name, key, file_path);
168+
if(UFILE_HAS_ERROR(error.code)){
169+
ufile_sdk_cleanup();
170+
printf("调用 ufile_multiple_upload_init 失败,错误信息为:%d, %s\n", error.code, error.message);
171+
return 1;
172+
}
173+
// 初始化线程池,线程数量为 jobs
174+
threadpool thpool = thpool_init(jobs);
175+
176+
FILE *fp = fopen(file_path, "rb");
177+
int i;
178+
for(i=0; ; i++){
179+
struct part_data *part = malloc(sizeof(struct part_data));
180+
part->state = &state;
181+
part->buf = malloc(state.part_size);
182+
part->buf_len = fread(part->buf, 1, state.part_size, fp);
183+
part->pos = i;
184+
if(part->buf_len == 0){
185+
free(part->buf);
186+
free(part);
187+
break;
188+
}
189+
// 为每个分片添加一个分片任务到线程池的工作队列中
190+
thpool_add_work(thpool, &upload_task, part);
191+
}
192+
// 等待线程池中的所有分片上传任务完成
193+
thpool_wait(thpool);
194+
// 分片上传任务完成,销毁线程池
195+
thpool_destroy(thpool);
196+
// 完成分片上传
197+
error = ufile_multiple_upload_finish(&state);
198+
if(UFILE_HAS_ERROR(error.code)){
199+
printf("调用 ufile_multiple_upload_part 失败,错误信息为:%s\n", error.message);
200+
}
201+
// 释放初始化SDK时分配的内存
202+
ufile_sdk_cleanup();
203+
return 0;
204+
}
205+
```
206+
</div>

0 commit comments

Comments
 (0)