O SDK do Object Storage Service (OSS) para Android oferece métodos para verificar a integridade e garantir a segurança dos dados durante o upload, download ou cópia de objetos.
Observações de uso
Antes de executar o código de exemplo deste tópico, crie uma instância OSSClient usando métodos como nome de domínio personalizado ou Security Token Service (STS). Para mais informações, consulte Inicialização (Android SDK).
Informações básicas
Devido à complexidade das redes móveis, podem ocorrer erros durante a transferência de dados entre o cliente e o servidor. O SDK do OSS para Android fornece os métodos de verificação CRC-64 e MD5 para assegurar a integridade dos dados.
Cyclic Redundancy Check
Ao ativar a verificação CRC-64 na leitura do fluxo de dados, o OSS valida automaticamente a integridade após a conclusão da leitura.
O código de exemplo a seguir demonstra como ativar o CRC-64:
Neste exemplo, usa-se a operação síncrona getObject. Execute operações síncronas em uma thread secundária.
// Specify the bucket name, such as examplebucket, and the full path of the object, such as exampledir/exampleobject.txt.
// Do not include the bucket name in the full path of the object.
String bucketName = "examplebucket";
String objectKey = "exampledir/exampleobject.txt";
GetObjectRequest request = new GetObjectRequest(bucketName, objectKey);
// Enable CRC-64 validation.
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();
}
Verificação de MD5
Para confirmar se o objeto enviado via multipart upload corresponde ao arquivo local, especifique o valor Content-MD5 na solicitação de upload de cada parte. O OSS verifica a consistência do valor MD5 para validar a integridade dos dados. O upload só é bem-sucedido quando o hash MD5 do objeto recebido pelo servidor OSS coincide com o valor Content-MD5 informado. Esse mecanismo garante a consistência do objeto carregado.
O código de exemplo a seguir ilustra como ativar a verificação de MD5:
// Specify the bucket name, such as examplebucket, the full path of the object, such as exampledir/exampleobject.txt, and the full path of the local file, such as /storage/emulated/0/oss/examplefile.txt.
// Do not include the bucket name in the full path of the object.
String bucketName = "examplebucket";
String objectKey = "exampledir/exampleobject.txt";
String filePath = "/storage/emulated/0/oss/examplefile.txt";
// Construct an upload request.
ObjectMetadata metadata = new ObjectMetadata();
try {
// Calculate the Base64-encoded MD5 hash.
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) {
// Handle request exceptions.
if (clientExcepion != null) {
// Handle client-side exceptions, such as network errors.
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// Handle server-side exceptions.
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
Referências
Para obter detalhes sobre como inicializar uma instância OSSClient, consulte Inicialização.