OSS Android SDK提供了資料完整性校正方法,保證您在上傳、下載和拷貝過程中資料的安全性。
注意事項
使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見如何初始化Android端OSSClient執行個體。
背景資訊
由於移動端網路環境的複雜性,資料在用戶端和伺服器之間傳輸時可能會出錯。為此,OSS Android SDK提供了基於CRC端到端以及MD5兩種資料完整性校正方式。
CRC校正
在讀取下載資料流的時候,如果開啟了CRC校正,會在資料流讀取完畢後自動驗證資料的完整性。
以下代碼用於開啟CRC校正:
說明
這裡提供的樣本為getObject的同步介面,同步介面需要在子線程中執行。
// 依次填寫Bucket名稱(例如examplebucket)、Object完整路徑(例如exampledir/exampleobject.txt)。
// Object完整路徑中不能包含Bucket名稱。
String bucketName = "examplebucket";
String objectKey = "exampledir/exampleobject.txt";
GetObjectRequest request = new GetObjectRequest(bucketName, objectKey);
// 開啟CRC效驗。
request.setCRC64(OSSRequest.CRC64Config.YES);
try{
GetObjectResult result = oss.getObject(request);
InputStream in = result.getObjectContent();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];
int len;
while ((len = in.read(buffer)) > -1) {
output.write(buffer, 0, len);
}
output.flush();
in.close();
} catch (ServiceException e) {
Log.e("ErrorCode", e.getErrorCode());
Log.e("RequestId", e.getRequestId());
Log.e("HostId", e.getHostId());
Log.e("RawMessage", e.getRawMessage());
} catch (ClientException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
MD5校正
如果要校正分區上傳到OSS的檔案和本地檔案是否一致,可以在上傳分區時攜帶分區的Content-MD5值,OSS伺服器會協助使用者進行MD5校正。只有OSS伺服器接收到的分區MD5值和Content-MD5一致時才可以上傳成功,從而保證上傳分區的一致性。
以下代碼用於設定MD5驗證:
// 依次填寫Bucket名稱(例如examplebucket)、Object完整路徑(例如exampledir/exampleobject.txt)和本地檔案完整路徑(例如/storage/emulated/0/oss/examplefile.txt)。
// Object完整路徑中不能包含Bucket名稱。
String bucketName = "examplebucket";
String objectKey = "exampledir/exampleobject.txt";
String filePath = "/storage/emulated/0/oss/examplefile.txt";
// 構造上傳請求。
ObjectMetadata metadata = new ObjectMetadata();
try {
// 計算base64編碼的md5
String fileMD5 = BinaryUtil.calculateBase64Md5(filePath);
Log.i("oss", "file md5: " + fileMD5);
metadata.setContentMD5(fileMD5);
} catch (IOException e) {
Log.e("oss", "Calculate file md5 error: " + e.getMessage());
}
PutObjectRequest put = new PutObjectRequest(bucketName, objectKey, filePath);
put.setMetadata(metadata);
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d("PutObject", "UploadSuccess");
Log.d("ETag", result.getETag());
Log.d("RequestId", result.getRequestId());
}
@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());
}
}
});
相關文檔
關於初始化OSSClient,請參見如何初始化Android端OSSClient執行個體。