以下示範了上傳、下載檔案的基本流程。更多細節用法可以參考本工程的:
sample目錄(包含上傳本地檔案,下載檔案,斷點續傳,設定callback回調等樣本)。點擊查看。
也可以直接git clone 工程。通過配置必要的參數:
然後運行工程,demo 如下:
STEP-1. 初始化OSSClient
初始化主要完成Endpoint設定、鑒權方式設定、Client參數設定。其中,鑒權方式包含自簽名模式、STS鑒權模式。如果要使用STS鑒權請先閱讀存取控制
章節瞭解RAM的基礎知識。以下內容假設您已開通RAM服務並瞭解RAM相關內容。瞭解如何獲取子賬戶AccessKeyId,SecretKeyId以及RoleArn資訊。
完善指令檔中AccessKeyId,SecretKeyId以及RoleArn參數資訊。通過python可以啟動一個本機http服務。在用戶端代碼中訪問本地服務從而獲得StsToken.AccessKeyId,StsToken.SecretKeyId以及StsToken.SecurityToken。
更多資訊可查看sample 中sts 使用方式點擊查看。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 在移動端建議使用STS方式初始化OSSClient。
// 更多資訊可查看sample 中 sts 使用方式(https://github.com/aliyun/aliyun-oss-android-sdk/tree/master/app/src/main/java/com/alibaba/sdk/android/oss/app)
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider("<StsToken.AccessKeyId>", "<StsToken.SecretKeyId>", "<StsToken.SecurityToken>");
//該配置類如果不設定,會有預設配置,具體可看該類
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 連接逾時,預設15秒
conf.setSocketTimeout(15 * 1000); // socket逾時,預設15秒
conf.setMaxConcurrentRequest(5); // 最大並發請求數,預設5個
conf.setMaxErrorRetry(2); // 失敗後最大重試次數,預設2次
//開啟可以在控制台看到日誌,並且會支援寫入手機sd卡中的一份記錄檔位置在SDCard_path\OSSLog\logs.csv 預設不開啟
//日誌會記錄oss操作行為中的請求資料,返回資料,異常資訊
//例如requestId,response header等
//android_version:5.1 android版本
//mobile_model:XT1085 android手機型號
//network_state:connected 網路狀況
//network_type:WIFI 網路連接類型
//具體的操作行為資訊:
//[2017-09-05 16:54:52] - Encounter local execpiton: //java.lang.IllegalArgumentException: The bucket name is invalid.
//A bucket name must:
//1) be comprised of lower-case characters, numbers or dash(-);
//2) start with lower case or numbers;
//3) be between 3-63 characters long.
//------>end of log
OSSLog.enableLog();
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
通過OSSClient發起上傳、下載請求是安全執行緒的,您可以並發執行多個任務。
STEP-2. 上傳檔案
這裡假設您已經在控制台上擁有自己的Bucket,這裡示範如何從把一個本地檔案上傳到OSS:
// 構造上傳請求
PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
// 非同步上傳時可以設定進度回調
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d("PutObject", "UploadSuccess");
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 請求異常
if (clientExcepion != null) {
// 本地異常如網路異常等
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服務異常
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.cancel(); // 可以取消任務
// task.waitUntilFinished(); // 可以等待直到任務完成
STEP-3. 下載指定檔案
下載一個指定object
,返回資料的輸入資料流,需要自行處理:
// 構造下載檔案請求
GetObjectRequest get = new GetObjectRequest("<bucketName>", "<objectKey>");
OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
// 請求成功
Log.d("Content-Length", "" + getResult.getContentLength());
InputStream inputStream = result.getObjectContent();
byte[] buffer = new byte[2048];
int len;
try {
while ((len = inputStream.read(buffer)) != -1) {
// 處理下載的資料
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 請求異常
if (clientExcepion != null) {
// 本地異常如網路異常等
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服務異常
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.cancel(); // 可以取消任務
// task.waitUntilFinished(); // 如果需要等待任務完成