2017-10-17 203 views
0

我正在使用C#和AWSSDK v3将文件上载到S3存储桶。该文件使用ServerSideEncryptionCustomerMethod加密。我可以上传文件,但是如果我使用S3FileInfo()检查文件是否存在,存在的错误是(400)错误请求。但是,如果我在上传例程中注释了指定加密的行,则S3FileInfo()。Exists将找到该文件而不会引发错误。我做错了什么?还是有一种不同的方式来检查加密时文件是否存在?Amazon.S3.IO.S3FileInfo()。存在对加密文件返回400错误请求

这是我上传的程序:

 public static string wfUpload(Stream pFileStream, string pBucketName, string pKeyName, string pCryptoKey) { 
     string retVal = ""; 
     try { 
      using (var lS3Client = new AmazonS3Client()) { 
       Aes aesEncryption = Aes.Create(); 
       aesEncryption.KeySize = 256; 
       aesEncryption.GenerateKey(); 
       string lCryptoKey = Convert.ToBase64String(aesEncryption.Key); 

       PutObjectRequest request = new PutObjectRequest { 
        BucketName = pBucketName, 
        Key = pKeyName, 
        ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, 
        ServerSideEncryptionCustomerProvidedKey = lCryptoKey, 
       }; 

       request.InputStream = pFileStream; 
       PutObjectResponse response = lS3Client.PutObject(request); 

       retVal = lCryptoKey; 
      } 
     } 
     catch (AmazonS3Exception s3Exception) { 
      Console.WriteLine(s3Exception.Message, 
           s3Exception.InnerException); 

      throw (s3Exception); 
     } 
     catch (Exception e) { 
      throw (e); 
     } 

     return retVal; 
    } 

而我的例行检查,如果该文件存在与否:

 public static bool wfFileExists(String pBucketName, String pKeyName) { 
     bool retVal = false; 
     try { 
      using (var lS3Client = new AmazonS3Client()) { 
       if (new Amazon.S3.IO.S3FileInfo(lS3Client, pBucketName, pKeyName).Exists) { 
        retVal = true; 
       } 
      } 
     } 
     catch (AmazonS3Exception s3Exception) { 
      Console.WriteLine(s3Exception.Message, 
           s3Exception.InnerException); 

      throw (s3Exception); 
     } 
     catch (Exception e) { 
      throw (e); 
     } 

     return retVal; 
    } 

回答

0

嗯,我认为类/方法我所用是一个不支持加密的高级API。我改变了我的代码来做一个元数据查询来查看是否有任何东西回来。如果找不到文件,它会在我检查的s3Exception中抛出一个“NotFound”ErrorCode。希望这可以帮助别人。如果别人提出更好的方法,我也很想学习它。

 public static bool wfFileExists(String pBucketName, String pKeyName, String pCryptoKey) { 
     bool retVal = false; 
     try { 
      using (var lS3Client = new AmazonS3Client()) { 
       GetObjectMetadataRequest request = new GetObjectMetadataRequest { 
        BucketName = pBucketName, 
        Key = pKeyName, 
        ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, 
        ServerSideEncryptionCustomerProvidedKey = pCryptoKey, 
       }; 

       GetObjectMetadataResponse lMetaData = lS3Client.GetObjectMetadata(request); 

       // If an error is not thrown, we found the metadata. 
       retVal = true; 
      } 
     } 
     catch (AmazonS3Exception s3Exception) { 
      Console.WriteLine(s3Exception.Message, 
           s3Exception.InnerException); 

      if (s3Exception.ErrorCode != "NotFound") { 
       throw (s3Exception); 
      } 
     } 
     catch (Exception e) { 
      throw (e); 
     } 

     return retVal; 
    }