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