2012-01-31 27 views
4

我是一名使用S3的初学者,我想用它来存储我的计算机的某些文件。我写了在Java小程序,它会将我的所有文件和文件夹,但我有这样的例外:无法在Java中以Amazon S3上传文件

Infos: Received error response: Status Code: 403, AWS Request ID: F75DC5496B071F7D, AWS Error Code: SignatureDoesNotMatch, AWS Error Message: The request signature we calculated does not match the signature you provided. Check your key and signing method., S3 Extended Request ID: XtRqjEuUmygswUxFUophRudYKbwi4OY4MK9QnYS4DMrH6JrHZXihUEC4mLZbPqz4 
Exception in thread "main" Status Code: 403, AWS Request ID: F75DC5496B071F7D, AWS Error Code: SignatureDoesNotMatch, AWS Error Message: The request signature we calculated does not match the signature you provided. Check your key and signing method., S3 Extended Request ID: XtRqjEuUmygswUxFUophRudYKbwi4OY4MK9QnYS4DMrH6JrHZXihUEC4mLZbPqz4 
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:538) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:283) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:168) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2555) 
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1044) 
    at com.socialite.s3export.S3Export.parseDirectory(S3Export.java:89) 
    at com.socialite.s3export.S3Export.parseDirectory(S3Export.java:73) 
    at com.socialite.s3export.S3Export.parse(S3Export.java:48) 
    at com.socialite.s3export.S3Export.main(S3Export.java:122) 

我相信我提供了正确的凭据SDK。我使用了以前的程序中的相同凭据来进行测试,并且工作正常。我可以创建桶,但我无法存储对象。在我的代码中,我使用PutObjectRequest来存储对象。

以下是我的init我的亚马逊S3对象:

AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(
      S3Export.class      .getResourceAsStream("AwsCredentials.properties"))); 

上载代码:

private void parseDirectory(File fin, File fdefault, String out) 
      throws FileNotFoundException { 

     System.out.println("processing .." + fin.getName()); 

     File[] files = fin.listFiles(); 

     PrintWriter pw = new PrintWriter(fdefault); 

     for (File f : files) { 

      String key = UUID.randomUUID().toString(); 

      String name = ""; 

      PutObjectRequest por = null; 

      if (f.isDirectory()) { 

       name = "d_" + f.getName() + ".properties"; 

       File metadata = new File(out + name); 

       parseDirectory(f, metadata, out); 

       pw.println(key + "=" + name); 

       //upload to s3 
       por = new PutObjectRequest(this.bucketName, key, metadata); 

      } else { 

       name = f.getName(); 

       pw.println(key + "=" + name); 

       por = new PutObjectRequest(this.bucketName, key, f); 

      } 


      this.amazonS3.putObject(por); 
     } 
     pw.close(); 
    } 

我的代码在这一行失败:this.amazonS3.putObject(por);

有人可以解释我的代码有什么问题。

回答

5

我终于找到了我的问题anwer。事实是在初始化时,我传递了一个错误的存储桶名称,并且我正在使用不同的名称来提出请求。就这样。

+2

请记住,您始终可以使用eclipse aws sdk生成示例项目,并了解与S3,SimpleDB等的交互如何工作。 – Kris 2012-02-01 10:02:48