2016-07-29 5 views
0

Я успешно загрузки нескольких частей файлов AWS S3, но теперь я пытаюсь объявления контрольной суммы MD5 для каждой части:Как сгенерировать контрольную сумму md5 для многостраничной загрузки AWS S3?

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) 
} 
Смежные вопросы