数据一致性校验 本节主要介绍数据一致性校验的操作。 应用场景 文件在上传下载过程中,有可能会因为网络劫持、数据缓存等原因,存在数据不一致的问题。 OOS提供通过计算MD5值的方式对上传下载的数据进行一致性校验。默认情况下,OOS不会进行一致性校验,您可以通过以下方式在上传下载时主动启用校验。 说明 下载文件时,只有当待下载文件具有MD5值时,MD5校验才会生效。 启用MD5进行数据一致性校验会影响上传下载性能。 前提条件 开通对象存储(经典版)Ⅰ型服务。 具体操作 上传文件时,OOS支持先在客户端计算出文件的MD5值,通过在上传文件时设置文件的ContentMD5值以开启一致性校验,OOS服务端再根据上传的文件内容计算出MD5值,最终与携带上传的MD5值进行对比,如果对比结果一致,文件上传成功,否则上传失败。 import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import com.amazonaws.ClientConfiguration; import com.amazonaws.Protocol; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.S3ClientOptions; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.util.BinaryUtils; import com.amazonaws.util.Md5Utils; public class uploadDemo{ private static String AK "your ak"; private static String SK "your sk"; private static String OOSDOMAIN "ooscn.ctyunapi.cn"; private static String BUCKET "yourbucketname"; public static AmazonS3 init() { ClientConfiguration cc new ClientConfiguration(); cc.setConnectionTimeout(100000); cc.setSocketTimeout(100000); cc.setProtocol(Protocol.HTTP); cc.setMaxConnections(100); cc.setMaxErrorRetry(0); AmazonS3 client new AmazonS3Client(new AWSCredentials() { @Override public String getAWSAccessKeyId() { return AK; } @Override public String getAWSSecretKey() { return SK; } }, cc); S3ClientOptions options new S3ClientOptions(); // 设置payload options.setPayloadSigningEnabled(false); client.setS3ClientOptions(options); client.setEndpoint(OOSDOMAIN); return client; } public static void uploadMD5check(AmazonS3 oosClient) { try { // 设置上传的文件 File file new File("D:testtest.txt"); // 获取文件内容并计算MD5值 byte[] md5Hash Md5Utils.computeMD5Hash(new FileInputStream(file)); // 设置MD5值 ObjectMetadata metadata new ObjectMetadata(); metadata.setContentMD5(BinaryUtils.toBase64(md5Hash)); // 带MD5值上传文件 InputStream is new FileInputStream(file); PutObjectRequest putreq new PutObjectRequest(BUCKET, "text.txt", is, metadata); oosClient.putObject(putreq); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { AmazonS3 oos init(); uploadMD5check(oos); } } 说明 文件的MD5值必须经过Base64编码。 OOS服务端会将该MD5值与文件计算出的MD5值进行对比,如果不匹配则上传失败,返回HTTP 400错误。如果匹配,文件上传成功,返回HTTP 200状态码。 下载文件时,OOS会将文件已有的MD5值与根据下载的文件内容计算出来的MD5值进行对比,如果对比结果一致,文件下载成功,否则下载失败。 import java.io.InputStream; import com.amazonaws.ClientConfiguration; import com.amazonaws.Protocol; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.S3ClientOptions; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.util.BinaryUtils; import com.amazonaws.util.Md5Utils; public class downloadDemo{ private static String AK "your ak"; private static String SK "your sk"; private static String OOSDOMAIN "ooscn.ctyunapi.cn"; private static String BUCKET "yourbucketname"; public static AmazonS3 init() { ClientConfiguration cc new ClientConfiguration(); cc.setConnectionTimeout(100000); cc.setSocketTimeout(100000); cc.setProtocol(Protocol.HTTP); cc.setMaxConnections(100); cc.setMaxErrorRetry(0); AmazonS3 client new AmazonS3Client(new AWSCredentials() { @Override public String getAWSAccessKeyId() { return AK; } @Override public String getAWSSecretKey() { return SK; } }, cc); S3ClientOptions options new S3ClientOptions(); // 设置payload options.setPayloadSigningEnabled(false); client.setS3ClientOptions(options); client.setEndpoint(OOSDOMAIN); return client; } public static void downloadMD5check(AmazonS3 oosClient) { try { // 获取文件元数据 ObjectMetadata objectMeta oosClient.getObjectMetadata(BUCKET, "text.txt"); // 获取元数据中的MD5值 String md5Origin objectMeta.getContentMD5(); // 下载文件,并计算文件内容的MD5值 S3Object object oosClient.getObject(BUCKET, "text.txt"); InputStream is object.getObjectContent(); byte[] md5Hash Md5Utils.computeMD5Hash(is); String contentMD5 BinaryUtils.toBase64(md5Hash); // 对比MD5值 if (md5Origin.contentEquals(contentMD5)) System.out.println("Object MD5 validation passes!n"); else System.out.println("Object MD5 validation failed!n"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { AmazonS3 oos init(); downloadMD5check(oos); } }