AWS s3 cpp sdk读取的字节数多于指定的范围

时间:2018-02-08 22:49:19

标签: c++ amazon-s3 aws-sdk-cpp

使用AWS s3 cpp sdk,我们尝试使用以下代码读取存储桶。当我们使用

指定一个小范围时
Aws::S3::Model::GetObjectRequest object_request;
object_request.SetRange(std::to_string(position) + "-" + std::to_string(position + nbytes));

因此,起始位置为0,结束位置为4。我们发现读操作实际上读的字节比我们分配给缓冲区的字节多。所以我们有一个69字节长的文件。如果我们尝试从中读取前4个字节,那么结果将从

返回
auto results = this->s3Client->GetObject(object_request);

我们发现从服务器读取的实际大小为69字节。文件的整个大小。当您指定非常小的操作时,是否存在sdk将尝试读取的最小值?这个值是否记录在某处?

以下是尝试从s3读取数据的实际功能。

arrow::Status S3ReadableFile::Read(int64_t nbytes, int64_t* bytesRead, uint8_t* buffer) {
    Aws::S3::Model::GetObjectRequest object_request;

    object_request.SetBucket(bucketName);
    object_request.SetKey(key);
    object_request.SetRange(std::to_string(position) + "-" + std::to_string(position + nbytes));

    auto results = this->s3Client->GetObject(object_request);

    if (!results.IsSuccess()) {
        //TODO: Make bad arrow status here
        *bytesRead = 0;
        return arrow::Status::IOError("Unable to fetch object from s3 bucket.");
    } else {
        //byutes read should always be full amount
        *bytesRead = nbytes; //should almost always be nBytes
        memcpy(buffer, results.GetResult().GetBody().rdbuf(), *bytesRead);
        position += *bytesRead;
        return arrow::Status::OK();
    }
}

这些是S3ReadableFile类的私有成员

    std::shared_ptr<Aws::S3::S3Client> s3Client;
    std::string bucketName;
    std::string key;
    size_t position;
    bool valid;

2 个答案:

答案 0 :(得分:0)

Range的值应为&#34; bytes = 0-4&#34; 请参阅:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35

答案 1 :(得分:0)

请确保您不执行以下操作

# wrong way of using ss
std::stringstream ss("bytes=");
ss << beg << '-' << end;
object_request.SetRange(ss.str().c_str());

假设beg为0,结束为10,

此操作无效,因为它将0-10传递给SDK。如果它不符合https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35,即bytes=0-10,它将下载所有字节。

正确的是,

std::stringstream ss();
ss << "bytes=" << beg << '-' << end;
object_request.SetRange(ss.str().c_str());

我花了很长时间才弄清楚!