private UploadFileResult uploadFileWithCheckpoint()

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;
    }