S3Client::GetObject with SetRange 返回错误的数据
S3Client::GetObject with SetRange returns wrong data?
我正在尝试读取从前 1048576 个字节开始的大型 AWS S3 对象的一段。 我指定了要读取的字节范围,但没有收到这些字节。 返回的长度是正确的。
我在这方面相当新,所以我可能做错了什么,成为一名 C 程序员而不是 C++ 并没有多大帮助。
这是我的代码示例:
int start=0, rbytes=0;
Aws::S3::S3Client s3_client;
Aws::S3::Model::GetObjectRequest read_object_request;
sprintf(range,"bytes=%lld-%lld",start,start+1048575);
read_object_request.SetBucket(container_name);
read_object_request.SetKey(object_name);
read_object_request.SetRange(range);
auto results = s3_client.GetObject(read_object_request);
if (results.IsSuccess())
{
rbytes = results.GetResult().GetContentLength();
std::cout << rbytes << " bytes read" << std::endl;
}
memcpy(bdata,results.GetResult().GetBody().rdbuf(),rbytes);
然后我转储 bdata 缓冲区,这不是我所期望的。 当我重复执行代码(一个新实例(时,它会返回不同的数据。
虽然我没有显示它,但 bdata 缓冲区是预先分配的 2 兆字节。
任何能为我指明正确方向的想法将不胜感激。
提前谢谢。
rdbuf()
是一个流,你把它当作一个内存指针。
这是我给
任何感兴趣的人的最终代码。 你也希望你提出任何意见。
#include <streambuf>
#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/s3/model/HeadObjectRequest.h>
#include <aws/s3/model/HeadObjectResult.h>
#include <aws/s3/model/Object.h>
long scanObject(Aws::String region,
Aws::String bucket_name,
Aws::String object_name);
int main(int argc, char** argv)
{
long scanned=0;
if (argc < 4){ return(1); }
Aws::String region = argv[1];
Aws::String bucket_name = argv[2];
Aws::String object_name = argv[3];
Aws::SDKOptions options;
Aws::InitAPI(options);
scanned = scanObject(region,bucket_name,object_name);
printf("Scanned %d bytes of objectn",scanned);
Aws::ShutdownAPI(options);
return(0);
}
long scanObject(Aws::String region,
Aws::String bucket_name,
Aws::String object_name)
{
int rbytes, nbytes;
char range[48], *buffer;
long filesize, bytesleft, start;
Aws::Client::ClientConfiguration cconfig;
cconfig.region = region;
Aws::S3::S3Client s3_client(cconfig);
Aws::S3::Model::HeadObjectRequest head_object_request;
head_object_request.WithBucket(bucket_name).WithKey(object_name);
Aws::S3::Model::HeadObjectOutcome head_object;
head_object = s3_client.HeadObject(head_object_request);
if (!head_object.IsSuccess())
{
printf("AWS Object, /%s/%s, failed to locaten",
region.c_str(),object_name.c_str());
return(-1);
}
filesize = head_object.GetResult().GetContentLength();
bytesleft = filesize;
start = 0;
nbytes = 1048576;
buffer = (char*)malloc(nbytes*2);
Aws::S3::Model::GetObjectRequest read_request;
while(bytesleft > 0)
{
if (bytesleft > 1048576){ nbytes = 1048576; }else{ nbytes = bytesleft; }
sprintf(range,"bytes=%d-%d",start,start+nbytes-1);
read_request.SetBucket(bucket_name);
read_request.SetKey(object_name);
read_request.SetRange(range);
auto results = s3_client.GetObject(read_request);
if (!results.IsSuccess())
{
printf("nUnable to fetch object range %s from s3 bucket.n",range);
return(-1);
}
rbytes = results.GetResult().GetContentLength();
std::streambuf* body = results.GetResult().GetBody().rdbuf();
body->sgetn(buffer,rbytes);
start += rbytes;
bytesleft -= rbytes;
}
return(filesize);
}
我相信这可以以更有效的方式完成,希望我会在我前进的过程中学到这一点。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 使用 char* 存储数据和产生的错误
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 创建服务失败0x6f7存根收到错误数据
- 通过 host() 从 af::array 检索数据会导致错误的数据
- OpenCV C++ 3 维垫数据访问错误值
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 错误 - 自定义数据类型作为有效负载,带有提升::几何
- C 如何忽略错误数据输入
- C ++编译指示OMP分割错误(数据竞争?)与数组
- C++ mac OS X El Capitan上的openmp,Valgrind错误(数据竞赛)
- 通过结构指针访问结构变量分配错误数据
- 我该怎么做 throw 来处理 C++ 中的错误数据类型
- C++:模拟餐饮公司计费程序-无法将错误数据输出到错误文件
- 使用boost::asio套接字接收错误数据
- 读取位图图像时获取错误数据
- 来自cudaMemcpy2D的错误数据
- VS2010 x64:64位平台VS2010中包含错误数据的对象数组
- c++ fstream输出错误数据