阿里云java的开发文档中提到:OSS 会将服务器端收到 Part 数据的 MD5 值放在 ETag 头内返回给用户。 为了保证数据在网络传输过程中不出现错误,强烈推荐用户在收到 OSS 的返回请求后,用该 MD5 值验证上传数据的正确性。
但是没有告诉怎么验证,纠结了一天之后终于找到了在本地求每个part的MD5值得方法:
<span style="font-size:18px;">private static HashMap<Integer, String> FileMD5(File bigFile) throws IOException{ int partCount = calPartCount(bigFile); HashMap<Integer, String> eTagMap = new HashMap<Integer, String>(); byte[] tempByte= new byte[5*1024*1024]; FileInputStream in = new FileInputStream(bigFile); for(int i = 0; i<partCount-1;i++){ try {</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>//part临时存储的路径 String outFilePath = "H:/aliyun/方寸指间图书分享"+(i+1); File outPartFile = new File(outFilePath); FileOutputStream out = new FileOutputStream(outPartFile); in.read(tempByte); out.write(tempByte); String md5 =DigestUtils.md5Hex(new FileInputStream(outPartFile)); eTagMap.put(i+1, md5); System.out.println("第"+(i+1)+"块数据的MD5:"+md5); out.close(); if(outPartFile.exists()) outPartFile.delete(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>//最后一个part的MD5 String md5 =DigestUtils.md5Hex(in); eTagMap.put(partCount, md5); System.out.println("第"+partCount+"块数据的MD5:"+md5); return eTagMap; }</span>
通过返回的MAP对象就可以跟oss返回的MD5进行比对来验证每个part是否上传成功。
时间: 2024-10-13 02:39:09