code: public MultipleFileUpload uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider) {
          if ( directory == null || !directory.exists() || !directory.isDirectory() ) {
              throw new IllegalArgumentException("Must provide a directory to upload");
          }
  
          List<File> files = new LinkedList<File>();
          listFiles(directory, files, includeSubdirectories);
  
          return uploadFileList(bucketName, virtualDirectoryKeyPrefix, directory, files, metadataProvider, taggingProvider);
      }
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.
  @param metadataProvider
  A callback of type <code>ObjectMetadataProvider</code> which
  is used to provide metadata for each file being uploaded.
  @param taggingProvider
  A callback of type <code>ObjectTaggingProvider</code> which
  is used to provide the tags for each file being uploaded.
  @return