Performing a Multipart Copy
If you have any questions during development, post them on the Issues page of GitHub. For details about parameters and usage of each API, see the .
As a special case of multipart upload, multipart copy implements multipart upload by copying the whole or partial object in a bucket. You can call ObsClient.copyPart to copy parts. Sample code is as follows:
// Hard-coded or plaintext AK/SK are risky. For security purposes, encrypt your AK/SK and store them in the configuration file or environment variables. In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, configure environment variables ACCESS_KEY_ID and SECRET_ACCESS_KEY_ID. // Obtain an AK/SK pair on the management console. For details, see https://support.huaweicloud.com/eu/usermanual-ca/ca_01_0003.html. String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; final String destBucketName = "destbucketname"; final String destObjectKey = "destobjectname"; final String sourceBucketName = "sourcebucketname"; final String sourceObjectKey = "sourceobjectname"; // Create an instance of ObsClient. final ObsClient obsClient = new ObsClient(ak, sk, endPoint); // Initialize the thread pool. ExecutorService executorService = Executors.newFixedThreadPool(20); // Initiate a multipart upload. InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(destBucketName, destObjectKey); InitiateMultipartUploadResult result = obsClient.initiateMultipartUpload(request); final String uploadId = result.getUploadId(); Log.i("CopyPart","\t"+ uploadId + "\n"); // Obtain information about the large object. ObjectMetadata metadata = obsClient.getObjectMetadata(sourceBucketName, sourceObjectKey); // Set the part size for copying to 100 MB. long partSize = 100 * 1024 * 1024L; long objectSize = metadata.getContentLength(); // Calculate the number of parts to be copied. long partCount = objectSize % partSize == 0 ? objectSize / partSize : objectSize / partSize + 1; final List<PartEtag> partEtags = Collections.synchronizedList(new ArrayList<PartEtag>()); // Concurrently copy parts. for (int i = 0; i < partCount; i++) { // Start position for copying final long rangeStart = i * partSize; // End position for copying final long rangeEnd = (i + 1 == partCount) ? objectSize - 1 : rangeStart + partSize - 1; // Part number final int partNumber = i + 1; executorService.execute(new Runnable() { @Override public void run() { CopyPartRequest request = new CopyPartRequest(); request.setUploadId(uploadId); request.setSourceBucketName(sourceBucketName); request.setSourceObjectKey(sourceObjectKey); request.setDestinationBucketName(destBucketName); request.setDestinationObjectKey(destObjectKey); request.setByteRangeStart(rangeStart); request.setByteRangeEnd(rangeEnd); request.setPartNumber(partNumber); CopyPartResult result; try { result = obsClient.copyPart(request); Log.i("CopyPart","Part#" + partNumber + " done\n"); partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber())); } catch (ObsException e) { Log.e("CopyPart", e.getMessage(), e); } } }); } // Wait until the copy is complete. executorService.shutdown(); while (!executorService.isTerminated()) { try { executorService.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { Log.e("CopyPart", e.getMessage(), e); } } // Combine parts. CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(destBucketName, destObjectKey, uploadId, partEtags); obsClient.completeMultipartUpload(completeMultipartUploadRequest);
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.