2011-10-31 10 views
1

私は次のものを返す第三者サーバーを使用しています。 1)URL 2)ACL 3)政策 4) 5 awsAccesskeyID)署名 6)キー 私は、次のコードAmazon S3Clientを使用してS3にファイルをアップロードする。

final File localFile = new File(localFilePath); 

final Part[] parts = { new StringPart("acl", acl), 
    new StringPart("policy", policy), 
    new StringPart("AWSAccessKeyId", awsAccessKeyId), 
    new StringPart("signature", signature), 
    new StringPart("key", key, HTTP.UTF_8), 
    new FilePart("file", localFile) }; 

    final MultipartRequestEntity mpRequestEntity = new MultipartRequestEntity(parts, filePost.getParams()); 

    filePost.setRequestEntity(mpRequestEntity); 
    final HttpClient client = new HttpClient(); 
    try 
    { 

     status = client.executeMethod(filePost); 
    } 

を使用してファイルをアップロードすることができます。しかし、今、私は次のコードを使用してAmazonS3Clientを使用したいが、その投げ例外

10-31 16その:21:36.070:INFO/com.amazonaws.request(13882):受信したエラー 応答:ステータスコード:403、AWSリクエストID:51F7CB27E58F88FD、AWS エラーコード:SignatureDoesNotMatch、AWSエラーメッセージ:計算した 署名の署名と、指定した署名が一致しません。あなたの鍵と署名の方法を確認し 、S3に拡張されたリクエストID:

 final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(awsAccessKeyId, key)); 


     // Create a list of UploadPartResponse objects. You get one of these 
     // for each part upload. 
     final List<PartETag> partETags = new ArrayList<PartETag>(); 

     // Step 1: Initialize. 
     final InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(targetURL, key); 
     final InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest); 

     final File file = new File(localFilePath); 
     final long contentLength = file.length(); 
     long partSize = 5242880; // Set part size to 5 MB. 

     try 
     { 
      // Step 2: Upload parts. 
      long filePosition = 0; 
      for (int i = 1; filePosition < contentLength; i++) 
      { 
       // Last part can be less than 5 MB. Adjust part size. 
       partSize = Math.min(partSize, (contentLength - filePosition)); 

       // Create request to upload a part. 
       final UploadPartRequest uploadRequest = new UploadPartRequest().withBucketName(targetURL).withKey(key) 
         .withUploadId(initResponse.getUploadId()).withPartNumber(i).withFileOffset(filePosition) 
         .withFile(file).withPartSize(partSize); 

       // Upload part and add response to our list. 
       partETags.add(s3Client.uploadPart(uploadRequest).getPartETag()); 

       filePosition += partSize; 
      } 

      // Step 3: complete. 
      final CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(targetURL, key, 
        initResponse.getUploadId(), partETags); 

      s3Client.completeMultipartUpload(compRequest); 
     } 
     catch (final Exception e) 
     { 
      s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(targetURL, key, initResponse.getUploadId())); 
      return false; 
     } 
     return true; 

YwNNsWOXg71vXY1VS0apHnHpHp4YVWRJ63xm8C7w36SYg1MNuIykw75YhQco5Lk7は、私はここで何かが足りないのですか?

+0

を行って..私は誤解していました署名とキーについて.. http://dextercoder.blogspot.in/2012/02/multipart-upload-to-amazon-s3-in-three.html – knocker

+0

こんにちは、このコードを使用して、アップロードを一時停止して後で再開しますか? – AndroidDev

答えて

0

サーバーが署名を送信してワンショットでファイルをアップロードしていることが判明しました。マルチパートアップロード複数の必要な署名と様々なステップで必要とされる意志の場合は... サーバー共有キー:(まで、複数の部分にファイルをアップロードする方法はありません。

http://dextercoder.blogspot.in/2012/02/multipart-upload-to-amazon-s3-in-three.html

関連する問題