You need to enable JavaScript to run this app.
导航

普通上传(Android SDK)

最近更新时间2024.02.04 18:31:00

首次发布时间2022.12.01 16:31:39

Android SDK 支持通过流式或者文件的方式上传一个对象到 TOS 服务端。本文介绍如何使用流式上传和文件上传方式上传您的数据。

上传说明

  • 流式上传:指使用文件流、网络流等流式数据或字符串、byte 数组作为 TOS 的数据源,其统一抽象为 InputStream 类进行上传。
  • 文件上传:指使用本地文件作为 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();
    }
}

指定 ACL、StorageClass、对象元数据

当进行流式上传或文件上传时,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