Upload files
Implement upload functionality
Upload from file
import 'package:amplify_flutter/amplify_flutter.dart';
Future<void> uploadFile() async { try { final result = await Amplify.Storage.uploadFile( localFile: AWSFile.fromPath('/path/to/local/file.txt'), path: const StoragePath.fromString('public/file.txt'), ).result; safePrint('Uploaded file: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
import 'dart:io' show File;
import 'package:amplify_flutter/amplify_flutter.dart';import 'package:aws_common/vm.dart';
Future<void> uploadFile(File file) async { try { final result = await Amplify.Storage.uploadFile( localFile: AWSFilePlatform.fromFile(file), path: const StoragePath.fromString('public/file.png'), ).result; safePrint('Uploaded file: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
import 'dart:html' show File;
import 'package:amplify_flutter/amplify_flutter.dart';import 'package:aws_common/web.dart';
Future<void> uploadFile(File file) async { final awsFile = AWSFilePlatform.fromFile(file); try { final result = await Amplify.Storage.uploadFile( localFile: awsFile, path: const StoragePath.fromString('public/file.png'), ).result; safePrint('Uploaded file: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
Upload from Flutter's file_picker
plugin
The file_picker plugin can be used to retrieve arbitrary file types from the user's device.
import 'package:amplify_flutter/amplify_flutter.dart';import 'package:file_picker/file_picker.dart';
Future<void> uploadImage() async { // Select a file from the device final result = await FilePicker.platform.pickFiles( type: FileType.custom, withData: false, // Ensure to get file stream for better performance withReadStream: true, allowedExtensions: ['jpg', 'png', 'gif'], );
if (result == null) { safePrint('No file selected'); return; }
// Upload file using the filename final platformFile = result.files.single; try { final result = await Amplify.Storage.uploadFile( localFile: AWSFile.fromStream( platformFile.readStream!, size: platformFile.size, ), path: StoragePath.fromString('public/${platformFile.name}'), onProgress: (progress) { safePrint('Fraction completed: ${progress.fractionCompleted}'); }, ).result; safePrint('Successfully uploaded file: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
Upload from data
To upload from a data object, specify the path
and data
, where data
is an instance of S3DataPayload
created from various data formats.
Future<void> uploadData() async { try { final result = await Amplify.Storage.uploadData( data: StorageDataPayload.string( 'hello world', contentType: 'text/plain', ), path: const StoragePath.fromString('public/example.txt'), ).result; safePrint('Uploaded data: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
Future<void> uploadData() async { try { final result = await Amplify.Storage.uploadData( data: StorageDataPayload.json({ 'title': 'example', 'author': { 'firstName': 'Jane', 'lastName': 'Doe', }, }), path: const StoragePath.fromString('public/example.json'), ).result; safePrint('Uploaded data: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
See more info about data URL.
Future<void> uploadData() async { // dataUrl should be a valid Data Url. // see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs const dataUrl = 'data:text/plain;charset=utf-8;base64,aGVsbG8gd29ybGQ='; try { final result = await Amplify.Storage.uploadData( data: StorageDataPayload.dataUrl(dataUrl), path: const StoragePath.fromString('public/example.txt'), ).result; safePrint('Uploaded data: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
Future<void> uploadBytes() async { try { final bytes = 'hello world'.codeUnits; final result = await Amplify.Storage.uploadData( data: StorageDataPayload.bytes( bytes, contentType: 'text/plain', ), path: const StoragePath.fromString('public/example.txt'), ).result; safePrint('Uploaded data: ${result.uploadedItem.path}'); } on StorageException catch (e) { safePrint(e.message); }}
Monitor upload progress
final operation = Amplify.Storage.uploadFile( localFile: AWSFile.fromPath('/path/to/local/file'), path: const StoragePath.fromString('public/example.txt'), onProgress: (progress) { safePrint('fraction totalBytes: ${progress.totalBytes}'); safePrint('fraction transferredBytes: ${progress.transferredBytes}'); safePrint('fraction completed: ${progress.fractionCompleted}'); });
Pause, resume, and cancel uploads
A call to Amplify.Storage.uploadFile
or Amplify.Storage.uploadData
returns a reference to the operation that is performing the upload.
Future<void> upload() async { final operation = Amplify.Storage.uploadFile( localFile: AWSFile.fromPath('/path/to/local/file'), path: const StoragePath.fromString('public/example.txt'), );
// pause operation await operation.pause();
// resume operation await operation.resume();
// cancel operation await operation.cancel();}
Upload to a specified bucket
You can also perform an upload
operation to a specific bucket by providing the bucket
option. You can pass in a StorageBucket
object representing the target bucket from the name defined in the Amplify Backend.
final data = 'multi bucket upload data byte'.codeUnits;final result = await Amplify.Storage.uploadData( data: StorageDataPayload.bytes(data), path: const StoragePath.fromString('path/to/file.txt'), options: StorageUploadDataOptions( // Specify a target bucket using name assigned in Amplify Backend bucket: StorageBucket.fromOutputs('secondBucket'), ),).result;
Alternatively, you can also pass in an object by specifying the bucket name and region from the console.
final data = 'multi bucket upload data byte'.codeUnits;final result = await Amplify.Storage.uploadData( data: StorageDataPayload.bytes(data), path: const StoragePath.fromString('path/to/file.txt'), options: StorageUploadDataOptions( // Alternatively, provide bucket name from console and associated region bucket: StorageBucket.fromBucketInfo( BucketInfo( bucketName: 'second-bucket-name-from-console', region: 'us-east-2', ), ), ),).result;
More upload options
Option | Type | Description |
---|---|---|
bucket | StorageBucket | The target bucket from the assigned name in the Amplify Backend or from the bucket name and region in the console Defaults to default bucket and region from the Amplify configuration if this option is not provided. Read more at Configure additional storage buckets |
getProperties | boolean | Whether to retrieve properties for the uploaded object using theAmplify.Storage.getProperties() after the operation completes. When set to true the returned item will contain additional info such as metadata and content type. |
useAccelerateEndpoint | boolean | Whether to use accelerate endpoint. Read more at Transfer Acceleration |
Example of uploadFile
with options:
final operation = Amplify.Storage.uploadFile( localFile: AWSFile.fromPath('/path/to/local/file'), path: const StoragePath.fromString('public/example.txt'), options: const StorageUploadFileOptions( metadata: {'key': 'value'}, pluginOptions: S3UploadFilePluginOptions( getProperties: true, useAccelerateEndpoint: true, ), ),);
Example of uploadData
with options:
final operation = Amplify.Storage.uploadData( data: StorageDataPayload.string('example'), path: const StoragePath.fromString('public/example.txt'), options: const StorageUploadDataOptions( metadata: {'key': 'value'}, pluginOptions: S3UploadDataPluginOptions( getProperties: true, useAccelerateEndpoint: true, ), ),);
MultiPart upload
Amplify will automatically perform an Amazon S3 multipart upload for objects that are larger than 5MB. For more information about S3's multipart upload, see Uploading and copying objects using multipart upload