2016-07-29 305 views
0

我成功上传多部分文件到AWS S3,但我现在在尝试广告MD5校验每一部分:如何为AWS S3多部分上传生成md5校验和?

static void sendPart(existingBucketName, keyName, multipartRepsonse, partNum, 
        sendBuffer, partSize, vertx, partETags, s3, req, resultClosure) 
{ 

    // Create request to upload a part. 
    MessageDigest md = MessageDigest.getInstance("MD5") 
    byte[] digest = md.digest(sendBuffer.bytes) 
    println(digest.toString()) 
    InputStream inputStream = new ByteArrayInputStream(sendBuffer.bytes) 
    UploadPartRequest uploadRequest = new UploadPartRequest() 
     .withBucketName(existingBucketName).withKey(keyName) 
     .withUploadId(multipartRepsonse.getUploadId()).withPartNumber(partNum) 
     .withInputStream(inputStream) 
     .withMD5Digest(Base64.getEncoder().encode(digest).toString()) 
     .withPartSize(partSize); 

    // Upload part and add response to our list. 
    vertx.executeBlocking({ future -> 

      // Do the blocking operation in here 

      // Imagine this was a call to a blocking API to get the result 
      try { 
       println("Sending chunk for ${keyName}") 
       PartETag eTag = s3.uploadPart(uploadRequest).getPartETag() 
       partETags.add(eTag); 
       println("Etag: " + eTag.ETag) 
       req.response().write("Sending Chunk\n") 
      } catch(Exception e) { 
      } 

      def result = "success!" 

      future.complete(result) 
     }, resultClosure) 
} 

不过,我得到以下错误:

AmazonS3Exception: The XML you provided was not well-formed or did not validate against our published schema (Service: Amazon S3; Status Code: 400; Error Code: MalformedXML; Request ID: 91542E819781FDFC), S3 Extended Request ID: yQs45H/ozn5+xlxV9lRgCQWwv6gQysT6A4ablq7/Epq06pUzy0qGvMc+YAkJjo/RsHk2dedH+pI=

我做错了什么?

回答

0

看起来我错误地转换了摘要。

static void sendPart(existingBucketName, keyName, multipartRepsonse, partNum, 
        sendBuffer, partSize, vertx, partETags, s3, req, resultClosure) 
{ 

    // Create request to upload a part. 
    MessageDigest md = MessageDigest.getInstance("MD5") 
    byte[] digest = md.digest(sendBuffer.bytes) 
    InputStream inputStream = new ByteArrayInputStream(sendBuffer.bytes) 
    UploadPartRequest uploadRequest = new UploadPartRequest() 
     .withBucketName(existingBucketName).withKey(keyName) 
     .withUploadId(multipartRepsonse.getUploadId()).withPartNumber(partNum) 
     .withInputStream(inputStream) 
     .withMD5Digest(Base64.getEncoder().encodeToString(digest)) 
     .withPartSize(partSize) 

    // Upload part and add response to our list. 
    vertx.executeBlocking({ future -> 

      try { 
       println("Sending chunk for ${keyName}") 
       PartETag eTag = s3.uploadPart(uploadRequest).getPartETag() 
       partETags.add(eTag); 
       req.response().write("Sending Chunk\n") 
      } catch(Exception e) { 
      } 

      def result = "success!" 

      future.complete(result) 
     }, resultClosure) 
}