public PresignedUrlDownload download(final PresignedUrlDownloadRequest request,
                                         final File destFile,
                                         final PresignedUrlDownloadConfig downloadContext) {
        assertParameterNotNull(request,
                               "A valid PresignedUrlDownloadRequest must be provided to initiate download");
        assertParameterNotNull(destFile,
                               "A valid file must be provided to download into");
        assertParameterNotNull(downloadContext,
                               "A valid PresignedUrlDownloadContext must be provided");

        assertNotObjectLambdaUrl(request.getPresignedUrl(), "download");

        appendSingleObjectUserAgent(request);
        String description = "Downloading from the given presigned url: " + request.getPresignedUrl();

        TransferProgress transferProgress = new TransferProgress();
        S3ProgressListenerChain listenerChain = new S3ProgressListenerChain(new TransferProgressUpdatingListener(transferProgress),
                                                                            request.getGeneralProgressListener(),
                                                                            downloadContext.getS3progressListener());
        request.setGeneralProgressListener(new ProgressListenerChain(new TransferCompletionFilter(), listenerChain));

        Long startByte = 0L;
        Long endByte = null;

        final ObjectMetadata objectMetadata = getObjectMetadataUsingRange(request);
        long[] range = request.getRange();
        if (range != null && range.length == 2) {
            startByte = range[0];
            endByte = range[1];
        } else {
            if (objectMetadata != null) {
                Long contentLength = TransferManagerUtils.getContentLengthFromContentRange(objectMetadata);
                endByte = contentLength != null ? contentLength - 1 : null;
            }
        }

        if (objectMetadata != null && objectMetadata.getETag() != null) {
            // Add ETag header if not already present
            if (request.getMatchingETagConstraints() != null
                    && request.getMatchingETagConstraints().isEmpty()) {
                request.withMatchingETagConstraint(objectMetadata.getETag());

            }
        }

        final long perRequestDownloadSize = downloadContext.getDownloadSizePerRequest();
        final boolean isDownloadParallel = isDownloadParallel(request, startByte, endByte, perRequestDownloadSize);

        final PresignedUrlDownloadImpl download =
            new PresignedUrlDownloadImpl(description, transferProgress, listenerChain, request);

        if (startByte != null && endByte != null) {
            transferProgress.setTotalBytesToTransfer(endByte - startByte + 1);
        }

        final CountDownLatch latch = new CountDownLatch(1);
        Future<File> future = executorService.submit(
            new PresignUrlDownloadCallable(executorService, destFile, latch, download, isDownloadParallel, timedThreadPool,
                                           downloadContext.getTimeoutMillis(), s3, request, perRequestDownloadSize,
                                           startByte, endByte, downloadContext.isResumeOnRetry()));

        download.setMonitor(new DownloadMonitor(download, future));
        latch.countDown();
        return download;
    }
Schedules a new transfer to download data from Amazon S3 using presigned url
and save it to the specified file. This method is non-blocking and returns immediately
(i.e. before the data has been fully downloaded).
<p>
Use the returned {@link PresignedUrlDownload} object to query the progress of the transfer,
add listeners for progress events, and wait for the download to complete.
</p>
<p>
Note: The result of the operation doesn't support pause and resume functionality.
</p>

@param request The request containing all the parameters for the download.
@param destFile  The file to download the object data to.
@param downloadContext Additional configuration to control the download behavior

@return A new {@link PresignedUrlDownload} object to check the state of the download,
        listen for progress notifications, and otherwise manage the download.
aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/transfer/TransferManager.java