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.comm.common.ACLType;
import com.volcengine.tos.comm.common.StorageClassType;
import com.volcengine.tos.comm.io.TosRepeatableBoundedFileInputStream;
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.ObjectMetaRequestOptions;
import com.volcengine.tos.model.object.UploadPartBasicInput;
import com.volcengine.tos.model.object.UploadPartFromFileInput;
import com.volcengine.tos.model.object.UploadPartFromFileOutput;
import com.volcengine.tos.model.object.UploadPartV2Input;
import com.volcengine.tos.model.object.UploadPartV2Output;
import com.volcengine.tos.model.object.UploadedPartV2;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
public class MultipartUploadExample 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 bucketName = "your bucket name";
String objectKey = "your object key";
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() {
CreateMultipartUploadInput create = new CreateMultipartUploadInput().setBucket(bucketName).setKey(objectKey);
ObjectMetaRequestOptions options = new ObjectMetaRequestOptions();
options.setAclType(ACLType.ACL_PRIVATE);
options.setStorageClass(StorageClassType.STORAGE_CLASS_STANDARD);
options.setContentType("text/plain");
options.setContentLanguage("en-US");
options.setContentDisposition("attachment;filename=123.txt");
options.setCacheControl("no-cache, no-store, must-revalidate");
options.setServerSideEncryption("AES256");
Map<String, String> custom = new HashMap<>();
custom.put("name", "volc_user");
options.setCustomMetadata(custom);
create.setOptions(options);
CreateMultipartUploadOutput createOutput = tos.createMultipartUpload(create);
Log.i("createMultipartUpload", "createMultipartUpload succeed, uploadID is " + createOutput.getUploadID());
uploadID = createOutput.getUploadID();
} catch (TosException e) {
Log.e("TosException", "createMultipartUpload failed");
long partSize = 5 * 1024 * 1024;
List<UploadedPartV2> uploadedParts = new ArrayList<>(5);
String filePath = "your data file path";
for (int i = 1; i <= 3; ++i) {
FileInputStream content = new FileInputStream(filePath);
InputStream wrappedContent = new TosRepeatableBoundedFileInputStream(content, partSize);
long skip = (i-1) * partSize;
UploadPartBasicInput basicInput = new UploadPartBasicInput().setBucket(bucketName)
.setKey(objectKey).setUploadID(uploadID).setPartNumber(i);
UploadPartV2Input input = new UploadPartV2Input().setUploadPartBasicInput(basicInput)
.setContentLength(partSize).setContent(wrappedContent);
UploadPartV2Output output = tos.uploadPart(input);
uploadedParts.add(new UploadedPartV2().setPartNumber(i).setEtag(output.getEtag()));
Log.i("uploadPart", "uploadPart succeed, partNumber is " + output.getPartNumber() + ", etag is " +
output.getEtag() + ", crc64 value is " + output.getHashCrc64ecma());
}catch (IOException | TosException e) {
Log.e("TosException", "uploadPart failed");
UploadPartBasicInput basicInput = new UploadPartBasicInput().setBucket(bucketName)
.setKey(objectKey).setUploadID(uploadID).setPartNumber(4);
long offset = 3 * partSize;
UploadPartFromFileInput input = new UploadPartFromFileInput().setUploadPartBasicInput(basicInput)
.setFilePath(filePath).setPartSize(partSize).setOffset(offset);
UploadPartFromFileOutput output = tos.uploadPartFromFile(input);
uploadedParts.add(new UploadedPartV2().setPartNumber(4).setEtag(output.getUploadPartV2Output().getEtag()));
Log.i("createMultipartUpload", "uploadPart succeed, partNumber is " + output.getUploadPartV2Output().getPartNumber() +
", etag is " + output.getUploadPartV2Output().getEtag() + ", crc64 value is " + output.getUploadPartV2Output().getHashCrc64ecma());
} catch (TosException e) {
Log.e("TosException", "uploadPart failed");
UploadPartBasicInput basicInput = new UploadPartBasicInput().setBucket(bucketName)
.setKey(objectKey).setUploadID(uploadID).setPartNumber(5);
byte[] data = new byte[(int)partSize];
InputStream content = new ByteArrayInputStream(data);
UploadPartV2Input input = new UploadPartV2Input().setUploadPartBasicInput(basicInput)
.setContentLength(data.length).setContent(content);
UploadPartV2Output output = tos.uploadPart(input);
uploadedParts.add(new UploadedPartV2().setPartNumber(5).setEtag(output.getEtag()));
Log.i("uploadPart", "uploadPart succeed, partNumber is " + output.getPartNumber() + ", etag is " +
output.getEtag() + ", crc64 value is " + output.getHashCrc64ecma());
} catch (TosException e) {
Log.e("TosException", "uploadPart failed");
CompleteMultipartUploadV2Input complete = new CompleteMultipartUploadV2Input().setBucket(bucketName)
.setKey(objectKey).setUploadID(uploadID).setUploadedParts(uploadedParts);
CompleteMultipartUploadV2Output completedOutput = tos.completeMultipartUpload(complete);
Log.i("completeMultipartUpload", "completeMultipartUpload succeed, etag is " + completedOutput.getEtag() +
", crc64 value is " + completedOutput.getHashCrc64ecma() + ", location is " + completedOutput.getLocation());
}catch (TosException e) {
Log.e("TosException", "completeMultipartUpload failed");