【问题标题】:eTag algorithm for multipart S3 uploads in Java?Java中多部分S3上传的eTag算法?
【发布时间】:2014-12-17 05:19:50
【问题描述】:

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

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

获取每个上传部分的 md5 并将它们连接起来。然后,取串联的 md5 的 md5。最后加上一个“-”和上传的部分数。

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

例如

  • 283771245d05b26c35768d1f182fbac0 - 文件第 1 部分的 md5
  • 673c3f1ad03d60ea0f64315095ad7131 - 文件第 2 部分的 md5
  • 11c68be603cbe39357a0f93be6ab9e2c - 文件第 3 部分的 md5

串联 md5: 283771245d05b26c35768d1f182fbac0673c3f1ad03d60ea0f64315095ad713111c68be603cbe39357a0f93be6ab9e2c

上面连接字符串的 md5 与破折号和文件部分的数量
115671880ddffe8860d6aabd09139708-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 );
}

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

【问题讨论】:

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


    【解决方案1】:

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

    失败是因为:

    }  while ( bytesRead == bufferSize );
    

    如果文件恰好由 x 个部分组成,则失败。

    除此之外它失败了:

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

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

    换句话说,它总是失败。

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 1970-01-01
      • 2021-09-16
      • 2016-09-13
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      相关资源
      最近更新 更多