public Upload upload(final String bucketName, final String key, final File file)
        throws AmazonServiceException, AmazonClientException {
        return upload(new PutObjectRequest(bucketName, key, file));
    }
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/">Amazon Web Services
KMS</a>-encrypted objects, you need to specify the correct region of the
bucket on your client and configure Amazon Web Services 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.
aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/transfer/TransferManager.java