理论上,我理解用于生成S3多部分上传eTag的算法。但是,我没有得到预期的结果。有人可以帮忙吗?
多部分上传的eTag理论(至少我的理解):
获取每个上传部分的md5并将它们连接起来。然后,取连接的md5s的md5。最后,添加一个" - "以及上传的部分数量。
注意:下面的示例使用组成的md5值。生成的md5不是md5部分的实际md5
e.g。
连锁md5: 283771245d05b26c35768d1f182fbac0673c3f1ad03d60ea0f64315095ad713111c68be603cbe39357a0f93be6ab9e2c
上面连接字符串的md5以及短划线和文件部件数:
115671880dfdfe8860d6aabd09139708-3
要在Java中执行此操作,我尝试了两种方法 - 两者都没有返回正确的eTag值
int MB = 1048576;
int bufferSize = 5 * MB;
byte[] buffer = new byte[ bufferSize ];
try { // String method
FileInputStream fis = new FileInputStream( new File( fileName ) );
int bytesRead;
String md5s = "";
do {
bytesRead = fis.read( buffer );
String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex( new String( buffer ) );
md5s += md5;
} while ( bytesRead == bufferSize );
System.out.println( org.apache.commons.codec.digest.DigestUtils.md5Hex( md5s ) );
fis.close();
}
catch( Exception e ) {
System.out.println( e );
}
try { // Byte array method
FileInputStream fis = new FileInputStream( new File( fileName ) );
int bytesRead;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
do {
bytesRead = fis.read( buffer );
byteArrayOutputStream.write( org.apache.commons.codec.digest.DigestUtils.md5( buffer ) );
} while ( bytesRead == bufferSize );
System.out.println( org.apache.commons.codec.digest.DigestUtils.md5Hex( byteArrayOutputStream.toByteArray() ) );
fis.close();
}
catch( Exception e ) {
System.out.println( e );
}
有谁能发现为什么这两种算法都不起作用?
答案 0 :(得分:0)
您应该使用面向字节的方法。
失败的原因是:
} while ( bytesRead == bufferSize );
如果文件由x个部分组成,则失败。
除此之外,它失败了:
byteArrayOutputStream.write( org.apache.commons.codec.digest.DigestUtils.md5( buffer ) );
如果块没有完全填充带有字节,即当文件不包含精确的x部分时。
换句话说,它总是失败。