下载对象时,可以指定一个或多个限定条件。满足限定条件则下载,不满足则返回错误且不会进行下载。
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。