2017-12-27 18 views
0

Google Cloud Storage Java APIを使用してGoogle Cloud Storageにファイルをアップロードしようとしています。アップロード前にファイルのcrc32cチェックサム/ハッシュ不正なリクエスト400件のエラーファイルに生成されたMD5またはCRC32Cチェックサムを使用してGoogle Cloud Storageにファイルをアップロードしようとしています

私は(MD5とCRC32Cハッシュの両方のために)以下に示したものと同様のエラーを取得しておくと、私が間違っているの何見当がつかない

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "invalid", 
    "message": "Provided CRC32C \"qtQiXA==\" doesn't match calculated CRC32C \"AAAAAA==\"." 
    } 
    ], 
    "code": 400, 
    "message": "Provided CRC32C \"qtQiXA==\" doesn't match calculated CRC32C \"AAAAAA==\"." 
} 
} 

ファイルのアップロードが機能していない、MD5やCRC32Cチェックサム値ならばBlobInfoに設定されます。私は、ファイルのブロブをアップロードするWriteChannelを使用する前に達成しようとしています何のコードスニペットを以下に示します。

// Upload a blob to the identified bucket and use md5 or crc32c checksum 
BlobId blobId = BlobId.of(storageBucketName, sourceEvent.getFileName()); 
BlobInfo blobInfo = null; 
Storage.BlobWriteOption blobWriteOption = null; 

if(sourceEvent.getFileHash() != null && sourceEvent.getFileHashType() == FileIntegrityCheckType.CRC32C.getCheckType()) { 
    blobInfo = BlobInfo.newBuilder(blobId).setStorageClass(
      GoogleCloudStorageClass.getStorageClass(storageClass) 
    ).setCrc32c(sourceEvent.getFileHash()).build(); 
    blobWriteOption = Storage.BlobWriteOption.crc32cMatch(); 
} else if(sourceEvent.getFileHash() != null && sourceEvent.getFileHashType() == FileIntegrityCheckType.MD5.getCheckType()) { 
    blobInfo = BlobInfo.newBuilder(blobId).setStorageClass(
      GoogleCloudStorageClass.getStorageClass(storageClass) 
    ).setMd5(sourceEvent.getFileHash()).build(); 
    blobWriteOption = Storage.BlobWriteOption.md5Match(); 
} else { 
    blobInfo = BlobInfo.newBuilder(blobId).setStorageClass(
      GoogleCloudStorageClass.getStorageClass(storageClass)).build(); 
} 

私はGoogleのグアバハッシュAPIを使用してファイルCRC32C及びMD5ハッシュを生成するために使用していた方法が記載されています

private byte[] generateCrc32CheckSum(Path file) { 
     byte[] crc32CheckSum = new byte[0]; 

     if(file != null) { 
      byte[] buffer = new byte[SysConstants.FILE_READ_BUFFER_SIZE]; 
      int limit = -1; 
      HashFunction crc32cHashFunc = Hashing.crc32c(); 
      Hasher crc32cHasher = crc32cHashFunc.newHasher(); 

      try (FileInputStream fis = new FileInputStream(file.toFile())) { 
       while ((limit = fis.read(buffer)) > 0) { 
        crc32cHasher.putBytes(buffer, 0, limit); 
       } 

//     crc32CheckSum = crc32cHasher.hash().asBytes(); 
       crc32CheckSum = Ints.toByteArray(crc32cHasher.hash().asInt()); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return crc32CheckSum; 
    } 

    private byte[] generateMd5Hash(Path file) { 
     byte[] md5Hash = new byte[0]; 

     if(file != null) { 
      byte[] buffer = new byte[SysConstants.FILE_READ_BUFFER_SIZE]; 
      int limit = -1; 
      HashFunction md5HashFunc = Hashing.md5(); 
      Hasher md5Hasher = md5HashFunc.newHasher(); 

      try (FileInputStream fis = new FileInputStream(file.toFile())) { 
       while ((limit = fis.read(buffer)) > 0) { 
        md5Hasher.putBytes(buffer, 0, limit); 
       } 

       md5Hash = md5Hasher.hash().asBytes(); 

      } catch (IOException e) { 
       e.printStackTrace();    
      } 
     } 

     return md5Hash; 
    } 

私は、次の方法でBase64エンコードを実行します:以下

public void queueFileWithSizeAndIntegrityCheckToken(SourceEvent sourceEvent, FileTransferStatus queuedStatus) { 
    if(isFileTransferReady(sourceEvent)) { 
     String fileName = sourceEvent.getFileName(); 
     Path filePath = Paths.get(fileName); 

     if(filePath != null) { 
      long fileSize = filePath.toFile().length(); 

      if(fileSize > 0) { 
       sourceEvent.setFileSize(fileSize); 

       if (isIntegrityCheckEnabled) { 
        if (integrityCheckType.equalsIgnoreCase(FileIntegrityCheckType.CRC32C.getIntegrityCheckTokenType())) { 
         byte[] crc32CheckSum = generateCrc32CheckSum(filePath); 

         if(crc32CheckSum.length > 0) { 
          sourceEvent.setFileHash(BaseEncoding.base64().encode(crc32CheckSum)); 
          sourceEvent.setFileHashType(FileIntegrityCheckType.CRC32C.getCheckType()); 
         } 
        } else if (integrityCheckType.equalsIgnoreCase(FileIntegrityCheckType.MD5.getIntegrityCheckTokenType())) { 
         byte[] md5Token = generateMd5Hash(filePath); 

         if(md5Token.length > 0) { 
          sourceEvent.setFileHash(BaseEncoding.base64().encode(md5Token)); 
          sourceEvent.setFileHashType(FileIntegrityCheckType.MD5.getCheckType()); 
         } 
        } 
       } 

       fileTransferLogService.updateSourceEventStatus(sourceEvent, 
         queuedStatus); 
      } 
     } 
    } 
} 

誰かが親切に検討し、私は私が間違っているのか知っているさせることができますか?ありがとうございました。

+1

答えはありませんが、 'AAAAAA =='は空のファイルのCRC32Cです。それは役に立ちますか?他の何かがあなたに空のファイルをアップロードさせてしまうことがありますか? –

+0

私は空のファイルをアップロードしているとは思わない。 BlobInfoオブジェクトにcrc32cまたはmd5ハッシュを設定しないと、ファイルは正常にアップロードされます。私は、これらのハッシュタイプと値のいずれかを設定すると問題が発生します。 – Doug

答えて

0

上記のコードは機能し、Google Cloud StorageサービスまたはGoogle Cloud Storage Javaクライアントライブラリに問題はありません。

問題は解決されており、アップロードされるファイルの適切な処理と必要なcrc32cおよびmd5ハッシュ値の生成に明らかに影響するSpringのトランザクション設定によって発生しているようです。

関連する問題