數據一致性校驗
更新時間 2023-12-07 17:41:12
最近更新時間: 2023-12-07 17:41:12
分享文章
本節主要介紹數據一致性校驗的操作。
應用場景
文件在上傳下載過程中,有可能會因為網絡劫持、數據緩存等原因,存在數據不一致的問題。
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);
}
}