import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.volcengine.tos.TOSV2;
import com.volcengine.tos.TOSV2ClientBuilder;
import com.volcengine.tos.TosException;
import com.volcengine.tos.model.object.CompleteMultipartUploadV2Input;
import com.volcengine.tos.model.object.CompleteMultipartUploadV2Output;
import com.volcengine.tos.model.object.CreateMultipartUploadInput;
import com.volcengine.tos.model.object.CreateMultipartUploadOutput;
import com.volcengine.tos.model.object.HeadObjectV2Input;
import com.volcengine.tos.model.object.HeadObjectV2Output;
import com.volcengine.tos.model.object.UploadPartCopyV2Input;
import com.volcengine.tos.model.object.UploadPartCopyV2Output;
import com.volcengine.tos.model.object.UploadedPartV2;
import java.util.ArrayList;
public class UploadPartCopyExample extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
String endpoint = "your endpoint";
String region = "your region";
String accessKey = "your access key";
String secretKey = "your secret key";
String securityToken = "your security token";
String srcBucketName = "your src bucket name";
String srcObjectKey = "your src object key";
String bucketName = "your bucket name";
String objectKey = "your object key";
long partSize = 10 * 1024 * 1024;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey, securityToken);
Thread tosThread = new Thread(new Runnable() {
HeadObjectV2Output headInfo = tos.headObject(new HeadObjectV2Input().setBucket(srcBucketName).setKey(srcObjectKey));
long contentLength = headInfo.getHeadObjectBasicOutput().getContentLength();
CreateMultipartUploadInput create = new CreateMultipartUploadInput().setBucket(bucketName).setKey(objectKey);
CreateMultipartUploadOutput created = tos.createMultipartUpload(create);
String uploadID = created.getUploadID();
List<UploadedPartV2> partList = new ArrayList<>();
long rangeStart = 0, rangeEnd = 0;
while (rangeEnd < contentLength) {
rangeEnd = Math.min(rangeStart + partSize - 1, contentLength);
UploadPartCopyV2Input input = new UploadPartCopyV2Input().setBucket(bucketName).setKey(objectKey)
.setUploadID(uploadID).setSourceBucket(srcBucketName).setSourceKey(srcObjectKey)
.setPartNumber(partNumber).setCopySourceRange(rangeStart, rangeEnd);
UploadPartCopyV2Output output = tos.uploadPartCopy(input);
Log.i("uploadPartCopy", "uploadPartCopy succeed, part's etag is " + output.getEtag());
Log.i("uploadPartCopy", "uploadPartCopy succeed, part's partNumber is " + output.getPartNumber());
partList.add(new UploadedPartV2().setEtag(output.getEtag()).setPartNumber(output.getPartNumber()));
rangeStart = rangeEnd + 1;
CompleteMultipartUploadV2Input complete = new CompleteMultipartUploadV2Input().setBucket(bucketName)
.setKey(objectKey).setUploadID(uploadID).setUploadedParts(partList);
CompleteMultipartUploadV2Output output = tos.completeMultipartUpload(complete);
Log.i("uploadPartCopy", "copyObject succeed, object's etag is " + output.getEtag());
Log.i("uploadPartCopy", "copyObject succeed, object's crc64 is " + output.getHashCrc64ecma());
} catch (TosException e) {
Log.e("TosException", "copyObject failed");