code: public Future<AsperaTransaction> uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory,
  			boolean includeSubdirectories, AsperaConfig sessionDetails, ProgressListener progressListener) {
  		log.trace("AsperaTransferManager.uploadDirectory >> Starting Upload " + System.nanoTime());
  		checkAscpThreshold();
  
  		// Destination bucket and source path must be specified
  		if (bucketName == null || bucketName.isEmpty())
  			throw new SdkClientException("Bucket name has not been specified for upload");
  		if (directory == null || !directory.exists())
  			throw new SdkClientException("localFileName has not been specified for upload");
  		if (virtualDirectoryKeyPrefix == null || virtualDirectoryKeyPrefix.isEmpty())
  			throw new SdkClientException("remoteFileName has not been specified for upload");
  		
  		// Submit upload to thread pool
  		AsperaUploadDirectoryCallable uploadDirectoryCallable =  new AsperaUploadDirectoryCallable(this, bucketName, directory, virtualDirectoryKeyPrefix, sessionDetails, includeSubdirectories, progressListener);
  		Future<AsperaTransaction> asperaTransaction = executorService.submit(uploadDirectoryCallable);
  		
  		log.trace("AsperaTransferManager.uploadDirectory << Ending Upload " + System.nanoTime());
  		// Return AsperaTransaction
  		return asperaTransaction;
  
  		
  	}
docs: Subdirectories are included in the upload by default, to exclude ensure you pass through 'false' for
  includeSubdirectories param
  
  @param bucketName
  @param virtualDirectoryKeyPrefix
  @param directory
  @param includeSubdirectories
  @param sessionDetails
  @return