日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

OSS中如何在分片上傳中實現MD5校驗

概述

OSS的PutObject、AppendObject、PostObject、Multipart、UploadPart上傳接口均支持上傳時進行MD5校驗,在PutObject、AppendObject、PostObject上傳請求meta中設置Content-MD5參數,參數值為客戶端計算的文件MD5值。在分片上傳MultipartUpload請求中,meta是對于文件的設置,其中分片上傳實現MD5的校驗是在每個分片中實現的。本文以Java SDK為例,介紹分片上傳的MD5校驗實現方法。

說明:OSS的PutObject、AppendObject、PostObject、MultipartUpload上傳接口均支持上傳時進行CRC64校驗,并且默認是開啟的。

詳細信息

在OSS的Java SDK分片上傳中,MD5校驗是在每個分片中進行的,主要是調用UploadPartRequest中的setMd5Digest,用以設置客戶端計算該分片的本地MD5,具體案例如下所示。

說明:案例中的函數變量請根據現場實際情況進行填寫。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.codec.binary.Hex;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.CompleteMultipartUploadRequest;
import com.aliyun.oss.model.CompleteMultipartUploadResult;
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
import com.aliyun.oss.model.InitiateMultipartUploadResult;
import com.aliyun.oss.model.PartETag;
import com.aliyun.oss.model.UploadPartRequest;
import com.aliyun.oss.model.UploadPartResult;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import sun.security.provider.MD5;
public class FenPian {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。
String accessKeyId = "xxxx";
String accessKeySecret = "xxxx";
String bucketName = "bucketname";
// <yourObjectName>表示上傳文件到OSS時需要指定包含文件后綴在內的完整路徑,例如abc/efg/123.jpg
String objectName = "objectname";
String localFile = "localfile";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 創建InitiateMultipartUploadRequest對象。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// 如果需要在初始化分片時設置文件存儲類型,請參考以下示例代碼
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// request.setObjectMetadata(metadata);
// 初始化分片。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// 返回uploadId,它是分片上傳事件的唯一標識,您可以根據這個uploadId發起相關的操作,如取消分片上傳、查詢分片上傳等。
String uploadId = upresult.getUploadId();
// partETags是PartETag的集合。PartETag由分片的ETag和分片號組成。
List<PartETag> partETagsnew ArrayList<PartETag>();
// 計算文件有多少個分片。
final long partSize = 1 * 1024 * 1024L;   // 1MB
final File sampleFile = new File(localFile);
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);、
if (fileLength % partSize != 0) {
partCount++;
}
// 遍歷分片上傳。
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
InputStream instream = new FileInputStream(sampleFile);
InputStream instream1 = new FileInputStream(sampleFile);
// 跳過已經上傳的分片。
instream.skip(startPos);
instream1.skip(startPos);
String md5;
if(i==partCount-1){
//注意最后一個分片讀取的是到文件尾部的數據,非一個分片的大小
md5 = md5(instream1,fileLength - startPos);
}else{
md5 = md5(instream1,partSize);
}
//instream1.skip(n)
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(instream);
uploadPartRequest.setMd5Digest(md5);
// 設置分片大小。除了最后一個分片沒有大小限制,其他的分片最小為100 KB。
uploadPartRequest.setPartSize(curPartSize);
// 設置分片號。每一個上傳的分片都有一個分片號,取值范圍是1~10000,如果超出這個范圍,OSS將返回InvalidArgument的錯誤碼。
uploadPartRequest.setPartNumber( i + 1);
// 每個分片不需要按順序上傳,甚至可以在不同客戶端上傳,OSS會按照分片號排序組成完整的文件。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
//System.out.println("server md5" +uploadPartResult.getETag());
// 每次上傳分片之后,OSS的返回結果包含PartETag。PartETag將被保存在partETags中。
partETags.add(uploadPartResult.getPartETag());
}
// 創建CompleteMultipartUploadRequest對象。
// 在執行完成分片上傳操作時,需要提供所有有效的partETags。OSS收到提交的partETags后,會逐一驗證每個分片的有效性。當所有的數據分片驗證通過后,OSS將把這些分片組合成一個完整的文件。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// 如果需要在完成文件上傳的同時設置文件訪問權限,請參考以下示例代碼。
// completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.PublicRead);
// 完成上傳。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
// 關閉OSSClient。
ossClient.shutdown();
}
public static String md5(InputStream in , long length1) throws Exception{
byte[] bytes = new byte[(int) length1];

long length_tmp = length1;

int readSize = in.read(bytes, (int) 0, (int) length_tmp);

        return BinaryUtil.toBase64String(BinaryUtil.calculateMd5(bytes));
}
}

相關文檔

關于分片上傳更多信息,請參見分片上傳

適用于

  • 對象存儲OSS