Page updated Nov 14, 2023

Download files

There are three ways of getting data that was previously uploaded:

Download data

You can download to in-memory buffer Data object with Amplify.Storage.downloadData:

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)")
1let downloadTask = Amplify.Storage.downloadData(key: "ExampleKey")
2Task {
3 for await progress in await downloadTask.progress {
4 print("Progress: \(progress)")
5 }
7let data = try await downloadTask.value
8print("Completed: \(data)")

Download to file

You can download to a file URL with Amplify.Storage.downloadFile:

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")
1let downloadToFileName = FileManager.default.urls(
2 for: .documentDirectory,
3 in: .userDomainMask
6let downloadTask = Amplify.Storage.downloadFile(
7 key: "myKey",
8 local: downloadToFileName,
9 options: nil
11Task {
12 for await progress in await downloadTask.progress {
13 print("Progress: \(progress)")
14 }
16try await downloadTask.value

Generate a download URL

You can also retrieve a URL for the object in storage:

let url = try await Amplify.Storage.getURL(key: "ExampleKey") print("Completed: \(url)")
1let url = try await Amplify.Storage.getURL(key: "ExampleKey")
2print("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.

let url = try await Amplify.Storage.getURL( key: "ExampleKey", options: .init( pluginOptions: AWSStorageGetURLOptions( validateObjectExistence: true ) ) )
1let url = try await Amplify.Storage.getURL(
2 key: "ExampleKey",
3 options: .init(
4 pluginOptions: AWSStorageGetURLOptions(
5 validateObjectExistence: true
6 )
7 )

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.

func cancelDownload() { downloadTask.cancel() }
1func cancelDownload() {
2 downloadTask.cancel()

You can also pause and then resume the task.

downloadTask.pause() downloadTask.resume()

Download tasks are run using URLSessionTask instances internally. You can learn more about them in Apple's official documentation.