in src/main/java/com/aliyun/oss/internal/OSSUploadOperation.java [348:411]
private UploadFileResult uploadFileWithCheckpoint(UploadFileRequest uploadFileRequest) throws Throwable {
UploadFileResult uploadFileResult = new UploadFileResult();
UploadCheckPoint uploadCheckPoint = createUploadCheckPointWrap();
// The checkpoint is enabled, reading the checkpoint data from the
// checkpoint file.
if (uploadFileRequest.isEnableCheckpoint()) {
// The checkpoint file either does not exist, or is corrupted, the
// whole file needs the re-upload.
try {
loadUploadCheckPointWrap(uploadCheckPoint, uploadFileRequest.getCheckpointFile());
} catch (Exception e) {
remove(uploadFileRequest.getCheckpointFile());
}
// The file uploaded is updated, re-upload.
if (!uploadCheckPoint.isValid(uploadFileRequest.getUploadFile())) {
prepare(uploadCheckPoint, uploadFileRequest);
remove(uploadFileRequest.getCheckpointFile());
}
} else {
// The checkpoint is not enabled, re-upload.
prepare(uploadCheckPoint, uploadFileRequest);
}
// The progress tracker starts
ProgressListener listener = uploadFileRequest.getProgressListener();
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_STARTED_EVENT);
// Concurrently upload parts.
List<PartResult> partResults = upload(uploadCheckPoint, uploadFileRequest);
for (PartResult partResult : partResults) {
if (partResult.isFailed()) {
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_PART_FAILED_EVENT);
throw partResult.getException();
}
}
// The progress tracker publishes the data.
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_COMPLETED_EVENT);
// Complete parts.
CompleteMultipartUploadResult multipartUploadResult = complete(uploadCheckPoint, uploadFileRequest);
uploadFileResult.setMultipartUploadResult(multipartUploadResult);
// check crc64
if (multipartOperation.getInnerClient().getClientConfiguration().isCrcCheckEnabled()) {
Long clientCRC = calcObjectCRCFromParts(partResults);
multipartUploadResult.setClientCRC(clientCRC);
try {
OSSUtils.checkChecksum(clientCRC, multipartUploadResult.getServerCRC(), multipartUploadResult.getRequestId());
} catch (Exception e) {
ProgressPublisher.publishProgress(listener, ProgressEventType.TRANSFER_FAILED_EVENT);
throw new InconsistentException(clientCRC, multipartUploadResult.getServerCRC(), multipartUploadResult.getRequestId());
}
}
// The checkpoint is enabled and upload the checkpoint file.
if (uploadFileRequest.isEnableCheckpoint()) {
remove(uploadFileRequest.getCheckpointFile());
}
return uploadFileResult;
}