code: public MultipleFileUpload uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories) {
          return uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, null);
      }
docs: 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/">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 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.