There are three ways of getting data that was previously uploaded: ## Download data You can download to in-memory buffer [Data](https://developer.apple.com/documentation/foundation/data) object with `Amplify.Storage.downloadData`: ```swift let downloadTask = Amplify.Storage.downloadData(key: "ExampleKey") Task { for await progress in await downloadTask.progress { print("Progress: \(progress)") } } let data = try await downloadTask.value print("Completed: \(data)") ``` ```swift let downloadTask = Amplify.Storage.downloadData(key: "ExampleKey") let progressSink = downloadTask .inProcessPublisher .sink { progress in print("Progress: \(progress)") } let resultSink = downloadTask .resultPublisher .sink { if case let .failure(storageError) = $0 { print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)") } } receiveValue: { data in print("Completed: \(data)") } ``` ## Download to file You can download to a file [URL](https://developer.apple.com/documentation/foundation/url) with `Amplify.Storage.downloadFile`: ```swift let downloadToFileName = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask )[0].appendingPathComponent("myFile.txt") let downloadTask = Amplify.Storage.downloadFile( key: "myKey", local: downloadToFileName, options: nil ) Task { for await progress in await downloadTask.progress { print("Progress: \(progress)") } } try await downloadTask.value print("Completed") ``` ```swift let downloadToFileName = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask )[0].appendingPathComponent("myFile.txt") let downloadTask = Amplify.Storage.downloadFile( key: "myKey", local: downloadToFileName, options: nil ) let progressSink = downloadTask .inProcessPublisher .sink { progress in print("Progress: \(progress)") } let resultSink = downloadTask .resultPublisher .sink { if case let .failure(storageError) = $0 { print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)") } } receiveValue: { print("Completed") } ``` ## Generate a download URL You can also retrieve a URL for the object in storage: ```swift let url = try await Amplify.Storage.getURL(key: "ExampleKey") print("Completed: \(url)") ``` When creating a downloadable URL, you can choose to check if the file exists by setting `validateObjectExistence` to `true` in `AWSStorageGetURLOptions`. If the file is inaccessible or does not exist, a `StorageError` is thrown. This allows you to check if an object exists during generating the presigned URL, which you can then use to download that object. ```swift let url = try await Amplify.Storage.getURL( key: "ExampleKey", options: .init( pluginOptions: AWSStorageGetURLOptions( validateObjectExistence: true ) ) ) ``` ## Cancel, Pause, Resume Calls to `downloadData` or `downloadFile` return a reference to the task that is actually performing the download. To cancel the download (for example, in response to the user pressing a **Cancel** button), you simply call `cancel()` on the download task. ```swift func cancelDownload() { downloadTask.cancel() } ``` You can also pause and then resume the task. ```swift downloadTask.pause() downloadTask.resume() ``` Download tasks are run using `URLSessionTask` instances internally. You can learn more about them in [Apple's official documentation](https://developer.apple.com/documentation/foundation/urlsessiontask).