用于Java中多部分S3上传的eTag算法?

时间:2014-10-21 20:41:42

标签: java algorithm amazon-web-services hash amazon-s3

理论上,我理解用于生成S3多部分上传eTag的算法。但是,我没有得到预期的结果。有人可以帮忙吗?

多部分上传的eTag理论(至少我的理解)

获取每个上传部分的md5并将它们连接起来。然后,取连接的md5s的md5。最后,添加一个" - "以及上传的部分数量。

注意:下面的示例使用组成的md5值。生成的md5不是md5部分的实际md5

e.g。

  • 283771245d05b26c35768d1f182fbac0 - 档案第1部分' s md5
  • 673c3f1ad03d60ea0f64315095ad7131 - 文件第2部分md5
  • 11c68be603cbe39357a0f93be6ab9e2c - file part 3&m; s md5

连锁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 );
}

有谁能发现为什么这两种算法都不起作用?

1 个答案:

答案 0 :(得分:0)

您应该使用面向字节的方法。

失败的原因是:

}  while ( bytesRead == bufferSize );
如果文件由x个部分组成,则

失败。

除此之外,它失败了:

byteArrayOutputStream.write( org.apache.commons.codec.digest.DigestUtils.md5( buffer ) );

如果块没有完全填充带有字节,即当文件不包含精确的x部分时。

换句话说,它总是失败。