Android SDK 支持通过流式或者文件的方式上传一个对象到 TOS 服务端。本文介绍如何使用流式上传和文件上传方式上传您的数据。
说明
上传对象时,如果桶中已经存在同名对象,则新的对象会覆盖已有的对象。桶开启多版本的场景下,则会保留原有对象,生成一个新的版本号用于标识新上传的对象。
SDK 支持通过 putObject 接口进行流式上传。
以下代码展示如何将一个字符串或一个 byte 数组上传到 TOS。
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.PutObjectBasicInput; import com.volcengine.tos.model.object.PutObjectInput; import com.volcengine.tos.model.object.PutObjectOutput; import java.io.ByteArrayInputStream; public class PutObjectByteExample extends AppCompatActivity { @Override 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() { @Override public void run() { try{ String data = "1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+<>?,./ :'1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+<>?,./ :'"; ByteArrayInputStream stream = new ByteArrayInputStream(data.getBytes()); PutObjectBasicInput basicInput = new PutObjectBasicInput().setBucket(bucketName).setKey(objectKey); PutObjectInput putObjectInput = new PutObjectInput().setPutObjectBasicInput(basicInput).setContent(stream); PutObjectOutput output = tos.putObject(putObjectInput); Log.i("putObject", "succeed, object's etag is " + output.getEtag()); Log.i("putObject", "succeed, object's crc64 is " + output.getHashCrc64ecma()); } catch (TosException e) { Log.e("putObject", "failed"); e.printStackTrace(); } } }); tosThread.start(); } }
以下代码展示如何将一个网络文件作为网络流上传到 TOS。
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.PutObjectBasicInput; import com.volcengine.tos.model.object.PutObjectInput; import com.volcengine.tos.model.object.PutObjectOutput; import java.io.IOException; import java.io.InputStream; import java.net.URL; public class PutObjectFromUrlExample extends AppCompatActivity { @Override 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"; // 待上传的网络流地址 String url = "https://www.volcengine.com/"; 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() { @Override public void run() { try(InputStream inputStream = new URL(url).openStream();){ PutObjectBasicInput basicInput = new PutObjectBasicInput().setBucket(bucketName).setKey(objectKey); PutObjectInput putObjectInput = new PutObjectInput().setPutObjectBasicInput(basicInput).setContent(inputStream); PutObjectOutput output = tos.putObject(putObjectInput); Log.i("putObject", "putObject succeed, object's etag is " + output.getEtag()); Log.i("putObject", "putObject succeed, object's crc64 is " + output.getHashCrc64ecma()); } catch (TosException e) { Log.e("TosException", "putObject failed"); e.printStackTrace(); } catch (IOException e) { Log.e("IOException", "putObject read file failed"); e.printStackTrace(); } } }); tosThread.start(); } }
以下代码展示如何将一个文件流 FileInputStream 上传到 TOS。
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.PutObjectBasicInput; import com.volcengine.tos.model.object.PutObjectInput; import com.volcengine.tos.model.object.PutObjectOutput; import java.io.FileInputStream; import java.io.IOException; public class PutObjectFromFileInputStreamExample extends AppCompatActivity { @Override 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"; String filePath = "your file's path to putObject"; 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() { @Override public void run() { try(FileInputStream inputStream = new FileInputStream(filePath)){ PutObjectBasicInput basicInput = new PutObjectBasicInput().setBucket(bucketName).setKey(objectKey); PutObjectInput putObjectInput = new PutObjectInput().setPutObjectBasicInput(basicInput).setContent(inputStream); PutObjectOutput output = tos.putObject(putObjectInput); Log.i("putObject", "putObject succeed, object's etag is " + output.getEtag()); Log.i("putObject", "putObject succeed, object's crc64 is " + output.getHashCrc64ecma()); } catch (TosException e) { Log.e("TosException", "putObject failed"); e.printStackTrace(); } catch (IOException e) { Log.e("IOException", "putObject read file failed"); e.printStackTrace(); } } }); tosThread.start(); } }
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.PutObjectBasicInput; import com.volcengine.tos.model.object.PutObjectFromFileInput; import com.volcengine.tos.model.object.PutObjectFromFileOutput; public class PutObjectFromFileExample extends AppCompatActivity { @Override 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"; String filePath = "your file's path to putObject"; 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() { @Override public void run() { try { PutObjectBasicInput basicInput = new PutObjectBasicInput().setBucket(bucketName).setKey(objectKey); PutObjectFromFileInput putObjectInput = new PutObjectFromFileInput().setPutObjectBasicInput(basicInput).setFilePath(filePath); PutObjectFromFileOutput output = tos.putObjectFromFile(putObjectInput); Log.i("putObjectFromFile", "putObject succeed, object's etag is " + output.getPutObjectOutput().getEtag()); Log.i("putObjectFromFile", "putObject succeed, object's crc64 is " + output.getPutObjectOutput().getHashCrc64ecma()); } catch (TosException e) { Log.e("TosException", "putObjectFromFile failed"); e.printStackTrace(); } } }); tosThread.start(); } }
当进行流式上传或文件上传时,SDK 支持通过 PutObjectBasicInput 类设置待上传对象的元数据。以下代码展示如何设置待上传对象的元数据。
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.model.object.ObjectMetaRequestOptions; import com.volcengine.tos.model.object.PutObjectBasicInput; import com.volcengine.tos.model.object.PutObjectInput; import com.volcengine.tos.model.object.PutObjectOutput; import java.io.ByteArrayInputStream; import java.util.HashMap; import java.util.Map; public class PutObjectWithMetaExample extends AppCompatActivity { @Override 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() { @Override public void run() { try{ String data = "1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+<>?,./ :'1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+<>?,./ :'"; ByteArrayInputStream stream = new ByteArrayInputStream(data.getBytes()); ObjectMetaRequestOptions options = new ObjectMetaRequestOptions(); // 设置对象访问权限,此处为私有权限 options.setAclType(ACLType.ACL_PRIVATE); // 设置对象存储类型 options.setStorageClass(StorageClassType.STORAGE_CLASS_STANDARD); // SDK 默认会根据 objectKey 后缀识别 Content-Type,也可以自定义设置 options.setContentType("application/json"); // 设置对象内容语言 options.setContentLanguage("en"); // 设置对象被下载时的名称 options.setContentDisposition("attachment;filename=download.txt"); // 设置对象的网页缓存行为 options.setCacheControl("max-age=600"); // 设置对象MD5,用于服务端校验数据是否与客户端传输的一致 options.setContentMD5("yjtlyPoGKxvDj+QOPocqjg=="); // 设置对象的服务端加密方式,当前只支持 AES256 options.setServerSideEncryption("AES256"); // 自定义对象的元数据,对于自定义的元数据,SDK 会自动对 key 添加 // "X-Tos-Meta-" 的前缀,并存储在服务端。 Map<String, String> custom = new HashMap<>(); custom.put("name", "volc_user"); // 在 TOS 服务端存储的元数据为:"X-Tos-Meta-name: volc_user" options.setCustomMetadata(custom); PutObjectBasicInput basicInput = new PutObjectBasicInput().setBucket(bucketName).setKey(objectKey).setOptions(options); PutObjectInput putObjectInput = new PutObjectInput().setPutObjectBasicInput(basicInput).setContent(stream); PutObjectOutput output = tos.putObject(putObjectInput); Log.i("putObject", "putObject succeed, object's etag is " + output.getEtag()); Log.i("putObject", "putObject succeed, object's crc64 is " + output.getHashCrc64ecma()); } catch (TosException e) { Log.e("TosException", "putObject failed"); e.printStackTrace(); } } }); tosThread.start(); } }
关于上传对象的 API 文档,请参见 PutObject。