in sdk/src/OssClientImpl.cc [1504:1562]
GetObjectOutcome OssClientImpl::ResumableDownloadObject(const DownloadObjectRequest &request) const
{
const auto& reqeustBase = static_cast<const OssResumableBaseRequest &>(request);
int code = reqeustBase.validate();
if (code != 0) {
return GetObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code)));
}
auto getObjectMetaReq = GetObjectMetaRequest(request.Bucket(), request.Key());
if (request.RequestPayer() == RequestPayer::Requester) {
getObjectMetaReq.setRequestPayer(request.RequestPayer());
}
if (!request.VersionId().empty()) {
getObjectMetaReq.setVersionId(request.VersionId());
}
auto hOutcome = GetObjectMeta(getObjectMetaReq);
if (!hOutcome.isSuccess()) {
return GetObjectOutcome(hOutcome.error());
}
auto objectSize = hOutcome.result().ContentLength();
if (objectSize < (int64_t)request.PartSize()) {
auto getObjectReq = GetObjectRequest(request.Bucket(), request.Key(), request.ModifiedSinceConstraint(), request.UnmodifiedSinceConstraint(),request.MatchingETagsConstraint(), request.NonmatchingETagsConstraint(), request.ResponseHeaderParameters());
if (request.RangeIsSet()) {
getObjectReq.setRange(request.RangeStart(), request.RangeEnd());
}
if (request.TransferProgress().Handler) {
getObjectReq.setTransferProgress(request.TransferProgress());
}
if (request.RequestPayer() == RequestPayer::Requester) {
getObjectReq.setRequestPayer(request.RequestPayer());
}
if (request.TrafficLimit() != 0) {
getObjectReq.setTrafficLimit(request.TrafficLimit());
}
if (!request.VersionId().empty()) {
getObjectReq.setVersionId(request.VersionId());
}
getObjectReq.setResponseStreamFactory([=]() {
return GetFstreamByPath(request.FilePath(), request.FilePathW(),
std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary);
});
auto outcome = this->GetObject(getObjectReq);
std::shared_ptr<std::iostream> content = nullptr;
outcome.result().setContent(content);
if (IsFileExist(request.TempFilePath())) {
RemoveFile(request.TempFilePath());
}
#ifdef _WIN32
else if (IsFileExist(request.TempFilePathW())) {
RemoveFile(request.TempFilePathW());
}
#endif
return outcome;
}
ResumableDownloader downloader(request, this, objectSize);
return downloader.Download();
}