应用场景
文件在上传下载过程中,有可能会因为网络劫持、数据缓存等原因,存在数据不一致的问题。
OOS提供通过计算MD5值的方式对上传下载的数据进行一致性校验。默认情况下,OOS不会进行一致性校验,您可以通过以下方式在上传下载时主动启用校验。
说明
下载文件时,只有当待下载文件具有MD5值时,MD5校验才会生效。
启用MD5进行数据一致性校验会影响上传下载性能。
前提条件
开通对象存储(经典版)Ⅰ型服务。
具体操作
上传文件时,OOS支持先在客户端计算出文件的MD5值,通过在上传文件时设置文件的Content-MD5值以开启一致性校验,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 OOS_DOMAIN = "oos-cn.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(OOS_DOMAIN);
return client;
}
public static void uploadMD5check(AmazonS3 oosClient) {
try {
// 设置上传的文件
File file = new File("D:\\test\\test.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 OOS_DOMAIN = "oos-cn.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(OOS_DOMAIN);
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);
}
}