title: Put file to Amazon S3 using multipart upload
body: <p>I'm trying to upload a file with the Amazon Java SDK, via multipart upload. The idea is to pass an upload-id to an applet, which puts the file parts into a readonly-bucket. Going this way, I avoid to store AWS credentials in the applet.</p>
  
  <p>In my tests, I generate an upload-id with boto (python) and store a file into the bucket. That works well.</p>
  
  <p>My Applet gets a "403 Access denied" from the S3, and I have no idea why.</p>
  
  <p>Here's my code (which is partially taken from <a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/llJavaUploadFile.html">http://docs.amazonwebservices.com/AmazonS3/latest/dev/llJavaUploadFile.html</a>):</p>
  
  <pre><code>AmazonS3 s3Client = new AmazonS3Client();
  List&lt;PartETag&gt; partETags = new ArrayList&lt;PartETag&gt;();
  
  long contentLength = file.length();
  long partSize = Config.getInstance().getInt("part_size");
  String bucketName = Config.getInstance().getString("bucket");
  String keyName = "mykey";
  String uploadId = getParameter("upload_id");
  
  try {
      long filePosition = 0;
      for (int i = 1; filePosition &lt; contentLength; i++) {
  
          partSize = Math.min(partSize, (contentLength - filePosition));
  
          // Create request to upload a part.
          UploadPartRequest uploadRequest = new UploadPartRequest()
              .withBucketName(bucket).withKey(keyName)
              .withUploadId(uploadId).withPartNumber(i)
              .withFileOffset(filePosition)
              .withFile(file)
              .withPartSize(partSize);
  
          // Upload part and add response to our list.
          partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());
  
          filePosition += partSize;
      }
  
      System.out.println("Completing upload");
      CompleteMultipartUploadRequest compRequest = new 
                  CompleteMultipartUploadRequest(bucket, 
                                              keyName, 
                                              uploadId, 
                                              partETags);
  
      s3Client.completeMultipartUpload(compRequest);
  } catch (Exception e) {
      s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
              bucketName, keyName, uploadId));
  }
  </code></pre>
  
  <p>In the applet debug log, I find this, then:</p>
  
  <pre><code>INFO: Sending Request: PUT https://mybucket.s3.amazonaws.com /mykey Parameters: (uploadId: V4hwobOLQ1rYof54zRW0pfk2EfhN7B0fpMJTOpHOcmaUl8k_ejSo_znPI540.lpO.ZO.bGjh.3cx8a12ZMODfA--, partNumber: 1, ) Headers: (Content-Length: 4288546, Content-Type: application/x-www-form-urlencoded; charset=utf-8, ) 
  24.01.2012 16:48:42 com.amazonaws.http.AmazonHttpClient handleErrorResponse
  INFO: Received error response: Status Code: 403, AWS Service: null, AWS Request ID: DECF32CCFEE9EBF0, AWS Error Code: AccessDenied, AWS Error Message: Access Denied, S3 Extended Request ID: xtL1ixsGM2/vsxJ+cZRHpkPZ23SMfP8hZZjQCQnp8oWGwdS2/aGfYgomihyqaDCQ
  </code></pre>
  
  <p>Do you find any obvious failures in the code?</p>
  
  <p>Thanks,
  Stefan</p>