分片上传

本 SDK 提供了分片上传(Multipart Upload)功能,可以将要上传的文件分成多个数据块(US3 里又称之为 Part)来分别上传,适用于大文件。

本SDK提供UFileMput类用于分片上传操作。

分片上传流程

在US3中,一个完整的分片上传分为初始化分片 -> 上传分片 -> 完成分片(放弃分片)三个阶段。本SDK提供的相应方法如下,完整代码详见 Github

方法名 说明
UFileMput::MInit 初始化分片上传,US3 API 文档详见 InitiateMultipartUpload
UFileMput::MUpload 上传一个分片,US3 API 文档详见 UploadPart
UFileMput::MFinish 完成分片上传,US3 API 文档详见 FinishMultipartUpload

示例

执行该示例前请确保配置文件的正确性

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
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <ufile-cppsdk/api.h>

const char* bucket_name = "your bucket name";
const char* key = "your file key";
const char* file_path = "your local file to be uploaded";

int main() {
  // 实例化一个UFileMput对象
  ucloud::cppsdk::api::UFileMput uploader;

  // 设置bucket和key
  uploader.SetResource(bucket_name, key);

  // 设置文件路径
  uploader.SetUploadFile(file_path);

  // 初始化分片上传
  int ret = uploader.MInit();
  if (ret) {
    std::cerr << "minit error: retcode=" << UFILE_LAST_RETCODE()
              << ", errmsg=" << UFILE_LAST_ERRMSG() << std::endl;
    return ret;
  }

  // 获得文件的大小信息
  struct stat st;
  if (stat(file_path, &st)) {
    std::cerr << strerror(errno) << std::endl;
    return -1;
  }

  // 初始化分片编号
  ssize_t blk = 0;
  while (uploader.UploadedSize() < size_t(st.st_size)) {
    for (int i = 0; i < 20; ++i) {
      std::cerr << '\b';
    }

    // 输出上传进度
    std::cerr << "finished: " << uploader.UploadedSize() * 100 / st.st_size
              << "%";

    // 调用成员函数Mupload上传分片
    ret = uploader.MUpload(blk++);
    if (ret) {
      std::cerr << "mupload error: retcode=" << UFILE_LAST_RETCODE()
                << ", errmsg=" << UFILE_LAST_ERRMSG() << std::endl;
      return ret;
    }
  }
  std::cerr << std::endl;

  // 完成分片上传
  ret = uploader.MFinish(NULL);
  if (ret) {
    std::cerr << "mupload error: retcode=" << UFILE_LAST_RETCODE()
              << ", errmsg=" << UFILE_LAST_ERRMSG() << std::endl;
    return ret;
  }
  std::cout << "mput file success" << std::endl;

  return 0;
}