public UploadPartResult uploadPart()

in src/main/java/com/aliyun/oss/internal/OSSMultipartOperation.java [320:392]


    public UploadPartResult uploadPart(UploadPartRequest uploadPartRequest) throws OSSException, ClientException {

        assertParameterNotNull(uploadPartRequest, "uploadPartRequest");

        String key = uploadPartRequest.getKey();
        String bucketName = uploadPartRequest.getBucketName();
        String uploadId = uploadPartRequest.getUploadId();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);
        assertStringNotNullOrEmpty(uploadId, "uploadId");

        if (uploadPartRequest.getInputStream() == null) {
            throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("MustSetContentStream"));
        }

        InputStream repeatableInputStream = null;
        try {
            repeatableInputStream = newRepeatableInputStream(uploadPartRequest.buildPartialStream());
        } catch (IOException ex) {
            logException("Cannot wrap to repeatable input stream: ", ex);
            throw new ClientException("Cannot wrap to repeatable input stream: ", ex);
        }

        int partNumber = uploadPartRequest.getPartNumber();
        if (!checkParamRange(partNumber, 0, false, MAX_PART_NUMBER, true)) {
            throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("PartNumberOutOfRange"));
        }

        Map<String, String> headers = new HashMap<String, String>();
        populateUploadPartOptionalHeaders(uploadPartRequest, headers);

        populateRequestPayerHeader(headers, uploadPartRequest.getRequestPayer());
        populateTrafficLimitHeader(headers, uploadPartRequest.getTrafficLimit());

        // Use a LinkedHashMap to preserve the insertion order.
        Map<String, String> params = new LinkedHashMap<String, String>();
        params.put(PART_NUMBER, Integer.toString(partNumber));
        params.put(UPLOAD_ID, uploadId);

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(uploadPartRequest))
                .setMethod(HttpMethod.PUT).setBucket(bucketName).setKey(key).setParameters(params).setHeaders(headers)
                .setInputStream(repeatableInputStream).setInputSize(uploadPartRequest.getPartSize())
                .setUseChunkEncoding(uploadPartRequest.isUseChunkEncoding()).setOriginalRequest(uploadPartRequest)
                .build();

        final ProgressListener listener = uploadPartRequest.getProgressListener();
        ResponseMessage response = null;
        try {
            publishProgress(listener, ProgressEventType.TRANSFER_PART_STARTED_EVENT);
            response = doOperation(request, emptyResponseParser, bucketName, key);
            publishProgress(listener, ProgressEventType.TRANSFER_PART_COMPLETED_EVENT);
        } catch (RuntimeException e) {
            publishProgress(listener, ProgressEventType.TRANSFER_PART_FAILED_EVENT);
            throw e;
        }

        UploadPartResult result = new UploadPartResult();
        result.setPartNumber(partNumber);
        result.setETag(trimQuotes(response.getHeaders().get(OSSHeaders.ETAG)));
        result.setRequestId(response.getRequestId());
        result.setPartSize(uploadPartRequest.getPartSize());
        result.setResponse(response);
        ResponseParsers.setCRC(result, response);

        if (getInnerClient().getClientConfiguration().isCrcCheckEnabled()) {
            OSSUtils.checkChecksum(result.getClientCRC(), result.getServerCRC(), result.getRequestId());
        }

        return result;
    }