对象存储OSS
对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。
图片和音视频等应用的海量存储
OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。
Android SDK
dependencies {
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.3'
}
初始化
OSSClient 是 OSS 服务的 Android 客户端,它为调用者提供了一系列的方法进行操作、管理存储空间(Bucket)和文件(Object)等。 在使用 SDK 发起对 OSS 的请求前,您需要初始化一个 OSSClient 实例,并对它进行一些必要设置。
OSSAuthCredentialsProvider authCredentialsProvider = new OSSAuthCredentialsProvider(STS_INFO_URL);
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个。
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
mClient = new OSSClient(MyApplication.getInstance(), OSS_ENDPOINT, authCredentialsProvider, conf);
OSSLog.enableLog();
Endpoint
Endpoint 是阿里云 OSS 服务在各个区域的地址
STS鉴权模式
移动终端是一个不受信任的环境,把AccessKeyId和AccessKeySecret直接保存在终端用来加签请求,存在极高的风险。 如果使用STS鉴权模式,推荐使用OSSAuthCredentialsProvider方式直接访问鉴权应用服务器,token过期后可以自动更新。
存储空间
存储空间(Bucket)是存储对象(Object)的容器。对象都隶属于存储空间
文件操作
- 上传文件
- 下载文件
- 管理文件
示例代码
public class OSSWrapper {
private static final String TAG = "OSSWrapper";
private static final OSSWrapper WRAPPER = new OSSWrapper();
private OSSClient mClient;
// Endpoint 是阿里云 OSS 服务在各个区域的地址
private static final String OSS_ENDPOINT = "http://oss-cn-hangzhou.aliyuncs.com";
private static final String BUCKET_NAME = BUILD_TYPE.equals("release") ? "release" : "test";
private OSSWrapper() {
Log.d(TAG, "OSSWrapper create start");
OSSFederationCredentialProvider authCredentialsProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
Log.d(TAG, "getFederationToken");
return getOssFederationToken();
}
};
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个。
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
mClient = new OSSClient(MyApplication.getInstance(), OSS_ENDPOINT, authCredentialsProvider, conf);
OSSLog.enableLog();
Log.d(TAG, "OSSWrapper create end");
}
private OSSFederationToken getOssFederationToken() {
String jsonText = RequestUtils.getToken();
Log.d(TAG, jsonText);
try {
JSONObject credentials = new JSONObject(jsonText);
String ak = credentials.optString("AccessKeyId");
String sk = credentials.optString("AccessKeySecret");
String token = credentials.optString("SecurityToken");
String expiration = credentials.optString("Expiration");
return new OSSFederationToken(ak, sk, token, expiration);
} catch (JSONException e) {
Log.d(TAG, "getOssFederationToken: " + e);
}
return null;
}
public static OSSWrapper sharedWrapper() {
return WRAPPER;
}
/**
* 上传文件
*/
public void asyncPutObject(String objectKey, String filePath, final OSSCallback callback) {
final PutObjectRequest put = new PutObjectRequest(BUCKET_NAME, objectKey, filePath);
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
Log.d(TAG, "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
Log.d(TAG, "asyncPutObject start");
mClient.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d(TAG, "asyncPutObject: Upload Success");
Log.d(TAG, "ETag:" + result.getETag());
Log.d(TAG, "RequestId: " + result.getRequestId());
callback.onSuccess();
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
Log.d(TAG, "asyncPutObject: Upload Fail");
if (clientException != null) {
clientException.printStackTrace();
}
if (serviceException != null) {
Log.e(TAG, "ErrorCode: " + serviceException.getErrorCode());
Log.e(TAG, "RequestId" + serviceException.getRequestId());
Log.e(TAG, "HostId: " + serviceException.getHostId());
Log.e(TAG, "RawMessage: " + serviceException.getRawMessage());
}
}
});
}
public interface OSSCallback {
void onSuccess();
}
}