public MultipleFileUpload uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories) {
        return uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, null);
    }
Uploads all files in the directory given to the bucket named, optionally
recursing for all subdirectories.
<p>
S3 will overwrite any existing objects that happen to have the same key,
just as when uploading individual files, so use with caution.
</p>
<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 objects to.
@param virtualDirectoryKeyPrefix
           The key prefix of the virtual directory to upload to. Use the
           null or empty string to upload files to the root of the
           bucket.
@param directory
           The directory to upload.
@param includeSubdirectories
           Whether to include subdirectories in the upload. If true,
           files found in subdirectories will be included with an
           appropriate concatenation to the key prefix.
aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/transfer/TransferManager.java