下载文件
更新时间:2024-12-27
下载文件
BOS C++ SDK提供了丰富的文件下载接口,用户可以通过以下方式从BOS中下载文件:
- 简单流式下载
- 下载到本地文件
- 下载到内存中的字符串
- 断点续传下载
- 范围下载
- 下载进度条
简单流式下载
用户可以通过如下代码将Object输出到一个文件流中:
Cpp
1void getObject(Client& client, const std::string& bucketName, const std::string& objectKey) {
2
3 //获取文件输出流
4 FileOutputStream outStream("test.txt");
5
6 //方法一,通过request、response
7 //初始化request
8 GetObjectRequest getObjectRequest(bucketName, objectKey);
9 //将outStream作为输出对象
10 GetObjectResponse getObjectResponse(&outStream);
11 int ret = client.get_object(getObjectRequest, &getObjectResponse);
12
13 //方法二,通过便利接口,将Object写到outStream文件流中
14 ret = client.download_file(bucketName, objectKey, outStream);
15 ...
16}
直接下载Object到文件
用户可以通过如下代码直接将Object下载到指定文件:
Cpp
1// 下载Object到文件
2std::string localFileName = "test.txt";
3ObjectMetaData ObjectMetaData;
4
5//设置Object读取范围
6int64_t start = 0;
7int64_t length = 100;
8//下载Object
9int ret = client.download_file(bucketName, objectKey, localFileName, start, length, &ObjectMetaData); //存到test.txt中,ObjectMetaData
10...
当使用上面方法将Object直接下载到文件时,方法返回ObjectMetaData
对象。
使用下载进度条
C++
1// 上传进度回调函数
2// 注意该回调函数中不得出现耗时较长/阻塞操作, 会影响数据下载性能.
3// increment: 当次下载的数据量
4// transfered: 已下载数据量
5// total: 需下载的数据总量
6// userData: 用户自定义数据, 例如object bucket+key等.
7void progress_callback(int64_t increment, int64_t transfered, int64_t total, void* user_data) {
8 std::cout << "progress_callback[" << user_data << "] => " <<
9 increment <<" ," << transfered << "," << total << std::endl;
10}
11
12// 本地待接收数据文件
13std::string filename = "/tmp/get_file_test";
14FileOutputStream outStream(filename);
15
16GetObjectRequest req(BUCKET, "transfer_progress_2");
17GetObjectResponse rsp(&outStream);
18
19// 设置下载进度条相关数据
20TransferProgress progress;
21progress.transfer_progress_cb = progress_callback;
22rsp.set_progress(progress);
23
24// 下载数据到本地filename文件中
25int ret = client()->get_object(req, &rsp);
26if (ret) {
27 LOGF(WARN, "client err: %d", ret);
28}
29if (rsp.is_fail()) {
30 LOGF(WARN,
31 "get_object: [status_code = %d], [message = %s], [requestid = %s]",
32 rsp.status_code(),
33 rsp.error().message().c_str(),
34 rsp.error().request_id().c_str());
35}
使用单链接限速
C++
1// 本地待接收数据文件
2std::string filename = "/tmp/get_file_test";
3FileOutputStream outStream(filename);
4
5GetObjectRequest req(BUCKET, "traffic_limit_file");
6// 设置下载限速819200 bit/s(100KB/s)
7// 限速值范围为: [819200 ~ 838860800] 即 [100KB - 100MB/s]
8req.set_traffic_limit(819200);
9GetObjectResponse rsp(&outStream);
10
11// 下载数据到本地filename文件中
12int ret = client()->get_object(req, &rsp);
13if (ret) {
14 LOGF(WARN, "client err: %d", ret);
15}
16if (rsp.is_fail()) {
17 LOGF(WARN,
18 "get_object: [status_code = %d], [message = %s], [requestid = %s]",
19 rsp.status_code(),
20 rsp.error().message().c_str(),
21 rsp.error().request_id().c_str());
22}
下载到内存中的字符串
此方法直接将Object存到string
当中,不会写入磁盘
Cpp
1std::string inMemoryData;
2//方法一,通过request、response
3GetObjectRequest getObjectRequest(bucketName, objectKey);
4//将inMemoryData作为输出对象
5GetObjectResponse getObjectResponse(&inMemoryData);
6int ret = client.get_object(getObjectRequest, &getObjectResponse);
7
8if (ret != 0) {
9 return ret;
10}
11
12//方法二,通过便利接口
13ret = client.get_object(bucketName, objectKey, &inMemoryData);
14//打印出来
15std::cout << inMemoryData << std::endl;
范围下载
为了实现更多的功能,可以通过使用GetObjectRequest
来指定下载范围,实现更精细化地获取Object。如果指定的下载范围是0 - 100,则返回第0到第100个字节的数据,包括第100个,共101字节的数据,即[0, 100]。
Cpp
1GetObjectRequest getObjectRequest(bucketName, objectKey);
2//初始化文件输出流
3FileOutputStream outStream("test.txt");
4GetObjectResponse getObjectResponse(&outStream);
5//设置下载范围[0,100]字节数据
6int start = 0;
7int end = 100;
8getObjectRequest.set_range(start, end);
9int ret = client.get_object(getObjectRequest, &getObjectResponse);
10
11if (ret != 0) {
12 return ret;
13}
14return 0;
通过getObjectRequest
的set_range
方法可以设置返回Object的范围。用户也可以用此功能实现文件的分段下载和断点续传。
指定范围end
为较大值, 可下载从start
开始的Object数据。