You need to enable JavaScript to run this app.
导航
限定条件下载(Android SDK)
最近更新时间:2024.02.04 18:31:01首次发布时间:2022.12.01 16:31:40

下载对象时,可以指定一个或多个限定条件。满足限定条件则下载,不满足则返回错误且不会进行下载。

限定条件说明

TOS 支持的限定条件如下。

参数

描述

If-Modified-Since

如果指定的时间早于对象最后修改时间,则正常下载,否则返回 304 错误(Not modified)

If-Unmodified-Since

如果指定的时间等于或者晚于对象最后修改时间,则正常下载,否则返回 412 错误(Precondition failed)

If-Match

如果指定的 ETag 和待下载对象的 ETag 匹配,则正常下载,否则返回 412 错误( Precondition failed)

If-None-Match

如果指定的 ETag 和待下载对象的 ETag 不匹配,则正常下载,否则返回 304 错误(Not modified)

示例代码

以下代码展示如何设置限定条件进行对象下载。

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.GetObjectV2Input;
import com.volcengine.tos.model.object.GetObjectV2Output;
import com.volcengine.tos.model.object.ObjectMetaRequestOptions;

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class GetObjectWithIfConditionExample 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 path";

        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{
                    // 以下代码展示,如果指定的时间早于对象最后修改时间,则将其下载到本地文件
                    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = dateFormat.parse("2022-09-13 14:36:01");
                    ObjectMetaRequestOptions options = new ObjectMetaRequestOptions().setIfModifiedSince(date);
                    GetObjectV2Input input = new GetObjectV2Input().setBucket(bucketName).setKey(objectKey).setOptions(options);
                    try(FileOutputStream fileOutputStream = new FileOutputStream(filePath);
                        GetObjectV2Output output = tos.getObject(input)) {
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = output.getContent().read(buffer)) != -1) {
                            fileOutputStream.write(buffer, 0, length);
                        }
                        Log.i("getObject", "getObject succeed, object's metadata is " + output.getGetObjectBasicOutput());
                    } catch (IOException e) {
                        Log.e("IOException", "write data to file failed");
                        e.printStackTrace();
                    }
                } catch (TosException e) {
                    // SDK 针对 304 状态码会返回 TosException,用户需要自行判断
                    if (e.getStatusCode() == 304) {
                        Log.e("TosException", "server return 304 not modified");
                    } else if (e.getStatusCode() == 412) {
                        // 下载不存在的对象会返回404
                        Log.e("TosException", "server return 412 precondition failed.");
                    } else if (e.getStatusCode() == 404) {
                        // 下载不存在的对象会返回404
                        Log.e("TosException", "the object you want to download is not found");
                    } else {
                        Log.e("TosException", "getObject failed");
                    }
                    e.printStackTrace();
                } catch (ParseException e) {
                    Log.e("ParseException", "getObject failed");
                    e.printStackTrace();
                }
            }
        });

        tosThread.start();
    }
}

相关文档

关于下载对象的 API 文档,请参见 GetObject