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 }
6}
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
4)[0].appendingPathComponent("myFile.txt")
5
6let downloadTask = Amplify.Storage.downloadFile(
7 key: "myKey",
8 local: downloadToFileName,
9 options: nil
10)
11Task {
12 for await progress in await downloadTask.progress {
13 print("Progress: \(progress)")
14 }
15}
16try await downloadTask.value
17print("Completed")

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 )
8)

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()
3}

You can also pause and then resume the task.

downloadTask.pause() downloadTask.resume()
1downloadTask.pause()
2downloadTask.resume()

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