## Get Get a presigned URL of a stored file. You can specify some options: mainly [file access `level`](https://docs.amplify.aws/lib/storage/configureaccess/q/platform/js) and whether to `download` the file: ```typescript await Storage.get(key: string, config: { level?: private | protected | public, // defaults to `public` identityId?: string, // id of another user, if `level: protected` download?: boolean, // defaults to false expires?: number, // validity of the URL, in seconds. defaults to 900 (15 minutes) and maxes at 3600 (1 hour) contentType?: string, // set return content type, eg "text/html" validateObjectExistence?: boolean, // defaults to false cacheControl?: string, // Specifies caching behavior along the request/reply chain }); ``` `Storage.get` returns a signed URL `string` to your file if `download` is false, which is the default. You can use this to create a download link for users to click on. Note that this function **does not check if the file exists by default**. You can enable this check by setting `validateObjectExistence` to `true`. > Note: Currently, the expiration time of the presigned url is dependent on the session and will max out at 1 hour. ```js // get the signed URL string const signedURL = await Storage.get(key); // get key from Storage.list // inside your template or JSX code. Note doesn't work here because it is not same origin {fileName} ; ``` ### Check for existence of a file You can check for the existence of a file in the storage category's `get` API using the `validateObjectExistence` option. When this flag is enabled a `get` call will return a pre-signed URL if the file exists and raise a `404` error if it does not. This allows you to check if an object exists during generating the presigned URL, which you can then use to download that object. ```javascript // To check for existence of a file await Storage.get('filename.txt', { validateObjectExistence: true }); ``` If `download` is true, `Storage.get` returns an object with a `Body` field of type [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). It is up to you to programmatically save it to disk (we suggest a method below) or do whatever else you need with it. ### File download option The `download` option send you the object data for download or programmatic manipulation: ```javascript const result = await Storage.get(`filename.txt`, { download: true }); // data.Body is a Blob result.Body.text().then((string) => { // handle the String data return String }); ``` You can programmatically download Blobs using JavaScript: ```js export function downloadBlob(blob, filename) { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename || 'download'; const clickHandler = () => { setTimeout(() => { URL.revokeObjectURL(url); a.removeEventListener('click', clickHandler); }, 150); }; a.addEventListener('click', clickHandler, false); a.click(); return a; } // usage async function download() { const result = await Storage.get(fileKey, { download: true }); downloadBlob(result.Body, 'filename'); } ``` The full return signature of `Storage.get(key, { download: true })` looks like this: ```js { $metadata: { attempts: 1 httpHeaders: {content-length: "388187", content-type: "audio/x-m4a", last-modified: "Fri, 09 Oct 2020 14:29:13 GMT", x-amz-id-2: "/rRqsX/c2h5V00tYMtDY994wEenyPm0SDw1lyWyncWepyg+T6YJJSjLHKIsz0dxMI3kN5KjA6GQ=", …} httpStatusCode: 200 requestId: undefined totalRetryDelay: 0 }, Body: Blob {size: 388187, type: "audio/x-m4a"}, // this will vary ContentLength: 388187, ContentType: "audio/x-m4a", ETag: ""c05e324f61613c2472d47a8ee6fbb628"", LastModified: Fri Oct 09 2020 22:29:13 GMT+0800 (Singapore Standard Time) {}, Metadata: {}, __type: "GetObjectOutput", } ``` ### Monitor progress of download To track the progress of your download, you can use `progressCallback`: ```javascript Storage.get('filename.txt', { download: true, progressCallback(progress) { console.log(`Downloaded: ${progress.loaded}/${progress.total}`); } }); ``` ### File Access Levels You can choose to configure access level ahead of time, or at the point of calling `Storage.get`: ```javascript // Option 1: configure access ahead of time Storage.configure({ level: 'private' }); const result = await Storage.get('welcome.png'); // Gets the welcome.png belonging to current user // Option 2: configure access inside the call const result = await Storage.get('welcome.png', { level: 'private' }); // same effect ``` Here is a quick guide to the access levels - [see the docs](https://docs.amplify.aws/lib/storage/configureaccess/q/platform/js) for more detail: - `public`: Accessible by all users of your app. Files are stored under the `public/` path in your S3 bucket. - `protected`: Readable by all users, but writable only by the creating user. Files are stored under `protected/{user_identity_id}/` where the `user_identity_id` corresponds to the unique Amazon Cognito Identity ID for that user. ```javascript // To get current user's objects const result = await Storage.get('filename.txt', { level: 'protected' }); // To get other users' objects const result = await Storage.get('filename.txt', { level: 'protected', identityId: 'xxxxxxx' // the identityId of that user }); ``` - `private`: **Only accessible for the signed in user**. Files are stored under `private/{user_identity_id}/` where the `user_identity_id` corresponds to the unique Amazon Cognito Identity ID for that user. ### Download expiry You can use `expires` option to limit the availability of your URLs. This configuration returns the pre-signed URL that expires in 60 seconds: ```javascript await Storage.get('filename.txt', { expires: 60 }); ``` ### Frequently Asked Questions Users can run into unexpected issues, so we are giving you advance notice in documentation with links to open issues - please vote for what you need, to help the team prioritize. - `Storage.get` is cached; if you have recently modified a file you may not get the latest version right away. You can pass in `cacheControl: 'no-cache'` to get the latest version. - `Storage.get` only returns the latest cached version of the file; there is [not yet an API to view prior versions](https://github.com/aws-amplify/amplify-js/issues/2131). - [Image compression](https://github.com/aws-amplify/amplify-js/issues/6081) or CloudFront CDN caching for your S3 buckets is not yet possible. - There is no API for [Cognito Group-based access to files](https://github.com/aws-amplify/amplify-js/issues/3388). - There is currently [no API for getting the identityId of other users](https://github.com/aws-amplify/amplify-js/issues/5177); you have to retrieve this from elsewhere before calling `Storage.get`.