如果要下載的檔案太大,或者一次性下載耗時太長,您可以通過流式下載,一次處理部分內容,直到完成檔案的下載。
下載指定檔案後將獲得檔案的輸入資料流,此操作要求使用者對該Object有讀許可權。
注意事項
使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見如何初始化Android端OSSClient執行個體。
範例程式碼
同步調用:
// 構造下載檔案請求。
// 依次填寫Bucket名稱(例如examplebucket)和Object完整路徑(例如exampledir/exampleobject.txt)。Object完整路徑中不能包含Bucket名稱。
GetObjectRequest get = new GetObjectRequest("examplebucket", "exampledir/exampleobject.txt");
// 設定下載進度回調。
get.setProgressListener(new OSSProgressCallback<GetObjectRequest>() {
@Override
public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
OSSLog.logDebug("getobj_progress: " + currentSize+" total_size: " + totalSize, false);
}
});
try {
// 同步執行下載請求,返回結果。
GetObjectResult getResult = oss.getObject(get);
Log.d("Content-Length", "" + getResult.getContentLength());
// 擷取檔案輸入資料流。
InputStream inputStream = getResult.getObjectContent();
byte[] buffer = new byte[2048];
int len;
while ((len = inputStream.read(buffer)) != -1) {
// 處理下載的資料,例如圖片展示或者寫入檔案等。
}
// 下載後可以查看檔案中繼資料。
ObjectMetadata metadata = getResult.getMetadata();
Log.d("ContentType", metadata.getContentType());
} catch (ClientException e) {
// 本地異常如網路異常等。
e.printStackTrace();
} catch (ServiceException e) {
// 服務異常。
Log.e("RequestId", e.getRequestId());
Log.e("ErrorCode", e.getErrorCode());
Log.e("HostId", e.getHostId());
Log.e("RawMessage", e.getRawMessage());
} catch (IOException e) {
e.printStackTrace();
}
非同步呼叫:
// 構造下載檔案請求。
// 依次填寫Bucket名稱(例如examplebucket)、Object完整路徑(例如exampledir/exampleobject.txt)。
// Object完整路徑中不能包含Bucket名稱。
GetObjectRequest get = new GetObjectRequest("examplebucket", "exampledir/exampleobject.txt");
// 設定下載進度回調。
get.setProgressListener(new OSSProgressCallback<GetObjectRequest>() {
@Override
public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
OSSLog.logDebug("getobj_progress: " + currentSize+" total_size: " + totalSize, false);
}
});
OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
// 請求成功。
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());
}
}
});
相關文檔
關於流式下載的完整範例程式碼,請參見GitHub樣本。
關於流式下載的API介面說明,請參見GetObject。
關於初始化OSSClient,請參見如何初始化Android端OSSClient執行個體。