Name:
interface
Value:
Amplify has re-imagined the way frontend developers build fullstack applications. Develop and deploy without the hassle.

Page updated Apr 29, 2024

Upload files

Upload Files

The Put method uploads files into Amazon S3.

It returns a {key: S3 Object key} object on success:

const result = await Storage.put('test.txt', 'Hello');

Media uploads

Upload an image in your React Native app:

async function pathToImageFile() {
try {
const response = await fetch(pathToImageFile);
const blob = await response.blob();
await Storage.put('yourKeyHere', blob, {
contentType: 'image/jpeg' // contentType is optional
});
} catch (err) {
console.log('Error uploading file:', err);
}
}

When a networking error happens during the upload, Storage module retries upload for a maximum of 4 attempts. If the upload fails after all retries, you will get an error.

Public level

const result = await Storage.put('test.txt', 'Hello');

Protected level

const result = await Storage.put('test.txt', 'Protected Content', {
level: 'protected',
contentType: 'text/plain'
});

Private level

const result = await Storage.put('test.txt', 'Private Content', {
level: 'private',
contentType: 'text/plain'
});

Monitor progress of upload

To track the progress of your upload, you can use the progressCallback:

Storage.put('test.txt', 'File content', {
progressCallback(progress) {
console.log(`Uploaded: ${progress.loaded}/${progress.total}`);
}
});

Encrypted uploads

To utilize Server-Side Encryption with AWS KMS, the following options can be passed in with the Put API like so:

const serverSideEncryption = AES256 | aws:kms;
const SSECustomerAlgorithm = 'string';
const SSECustomerKey = new Buffer('...') || 'string';
const SSECustomerKeyMD5 = 'string';
const SSEKMSKeyId = 'string';
const result = await Storage.put('test.txt', 'File content', {
serverSideEncryption, SSECustomerAlgorithm, SSECustomerKey, SSECustomerKeyMD5, SSEKMSKeyId
});

Other options available are:

Storage.put('test.txt', 'My Content', {
cacheControl: 'no-cache', // (String) Specifies caching behavior along the request/reply chain
contentDisposition: 'attachment', // (String) Specifies presentational information for the object
expires: new Date().now() + 60 * 60 * 24 * 7, // (Date) The date and time at which the object is no longer cacheable. ISO-8601 string, or a UNIX timestamp in seconds
metadata: { key: 'value' }, // (map<String>) A map of metadata to store with the object in S3.
resumable: true, // (Boolean) Allows uploads to be paused and resumed
useAccelerateEndpoint: true // If enabled on the bucket, use accelerated S3 endpoint
});

Pause and resume uploads

Passing the resumable: true option to the Put API returns an object with the following methods: pause , resume. The Storage.cancel API is also available if you are looking to cancel the upload at any point of the upload.

const upload = Storage.put(file.name, file, {
resumable: true
});
upload.pause();
upload.resume();
Storage.cancel(upload);

When a page refresh occurs during the upload, re-initializing the upload with the same file will continue from previous progress point.

const upload = Storage.put(file.name, file, {
resumable: true
});
// This duplicate uploads will resume the original upload.
const duplicateUpload = Storage.put(file.name, file, {
resumable: true
});

Uploads that were initiated over one hour ago will be cancelled automatically. There are instances (e.g device went offline, user logs out) where the incomplete file remains in your S3 account. It is recommended to setup a s3 lifecycle rule to automatically cleanup incomplete upload requests.

Event handlers

With the resumable: true flag, there are 3 callback functions available: completeCallback, progressCallback and errorCallback.

const upload = Storage.put(file.name, file, {
resumable: true,
completeCallback: (event) => {
console.log(`Successfully uploaded ${event.key}`);
},
progressCallback: (progress) => {
console.log(`Uploaded: ${progress.loaded}/${progress.total}`);
},
errorCallback: (err) => {
console.error('Unexpected error while uploading', err);
}
});

Currently, the progressCallback event is dependent and based on the number of parts that are sent to S3. Currently, the library uploads at about 5 MB per part. If you upload a file smaller than this, the event will not be fired.