code: public Upload upload(final String bucketName, final String key, final File file)
          throws AmazonServiceException, AmazonClientException {
          return upload(new PutObjectRequest(bucketName, key, file));
      }
docs: Schedules a new transfer to upload data to Amazon S3. This method is
  non-blocking and returns immediately (i.e. before the upload has
  finished).
  <p>
  The returned Upload object allows you to query the progress of the
  transfer, add listeners for progress events, and wait for the upload to
  complete.
  <p>
  If resources are available, the upload will begin immediately, otherwise
  it will be scheduled and started as soon as resources become available.
  <p>
  If you are uploading <a href="http://aws.amazon.com/kms/">AWS
  KMS</a>-encrypted objects, you need to specify the correct region of the
  bucket on your client and configure AWS Signature Version 4 for added
  security. For more information on how to do this, see
  http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#
  specify-signature-version
  </p>
  
  @param bucketName
  The name of the bucket to upload the new object to.
  @param key
  The key in the specified bucket by which to store the new
  object.
  @param file
  The file to upload.
  
  @return A new Upload object which can be used to check state of the
  upload, listen for progress notifications, and otherwise manage
  the upload.
  
  @throws AmazonClientException
  If any errors are encountered in the client while making the
  request or handling the response.
  @throws AmazonServiceException
  If any errors occurred in Amazon S3 while processing the
  request.