in src/main/java/com/aliyun/oss/internal/OSSDownloadOperation.java [399:469]
private DownloadFileResult downloadFileWithCheckpoint(DownloadFileRequest downloadFileRequest) throws Throwable {
DownloadFileResult downloadFileResult = new DownloadFileResult();
DownloadCheckPoint downloadCheckPoint = new DownloadCheckPoint();
// The checkpoint is enabled, downloads the parts download results from
// checkpoint file.
if (downloadFileRequest.isEnableCheckpoint()) {
// read the last download result. If checkpoint file dosx not exist,
// or the file is updated/corrupted,
// re-download again.
try {
downloadCheckPoint.load(downloadFileRequest.getCheckpointFile());
} catch (Exception e) {
remove(downloadFileRequest.getCheckpointFile());
}
// The download checkpoint is corrupted, download again.
if (!downloadCheckPoint.isValid(objectOperation, downloadFileRequest)) {
prepare(downloadCheckPoint, downloadFileRequest);
remove(downloadFileRequest.getCheckpointFile());
}
} else {
// The checkpoint is not enabled, download the file again.
prepare(downloadCheckPoint, downloadFileRequest);
}
// Progress listen starts tracking the progress.
ProgressListener listener = downloadFileRequest.getProgressListener();
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_STARTED_EVENT);
// Concurrently download parts.
DownloadResult downloadResult = download(downloadCheckPoint, downloadFileRequest);
Long serverCRC = null;
for (PartResult partResult : downloadResult.getPartResults()) {
if (partResult.getServerCRC() != null) {
serverCRC = partResult.getServerCRC();
}
if (partResult.isFailed()) {
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_PART_FAILED_EVENT);
throw partResult.getException();
}
}
// check crc64
if(objectOperation.getInnerClient().getClientConfiguration().isCrcCheckEnabled() &&
!hasRangeInRequest(downloadFileRequest)) {
Long clientCRC = calcObjectCRCFromParts(downloadResult.getPartResults());
try {
OSSUtils.checkChecksum(clientCRC, serverCRC, downloadResult.getObjectMetadata().getRequestId());
} catch (Exception e) {
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_FAILED_EVENT);
throw new InconsistentException(clientCRC, serverCRC, downloadResult.getObjectMetadata().getRequestId());
}
}
// Publish the complete status.
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_COMPLETED_EVENT);
// rename the temp file.
renameTo(downloadFileRequest.getTempDownloadFile(), downloadFileRequest.getDownloadFile());
// The checkpoint is enabled, delete the checkpoint file after a
// successful download.
if (downloadFileRequest.isEnableCheckpoint()) {
remove(downloadFileRequest.getCheckpointFile());
}
downloadFileResult.setObjectMetadata(downloadResult.getObjectMetadata());
return downloadFileResult;
}