Skip to content

Dart SDK to handle download and Uploads to AWS S3 service. Add resume download and Multipart Upload for Large files

License

Notifications You must be signed in to change notification settings

PeterAkande/aws_s3_storage_service

Repository files navigation

A simple Package to handle Uploads, Multipart Uploads and Downloads in Dart and Flutter apps.

import 'dart:io';

import 'package:path/path.dart' as p;

import 'package:aws_storage_service/src/aws_storage_service.dart';

AwsCredentialsConfig credentialsConfig = AwsCredentialsConfig(
  accessKey: 'YOURACCESSKEY', // This is a test accessKey
  bucketName: 'testbucket', // The bucket name
  region: 'us-west-2', // The region of your Aws bucket allocation
  secretKey: 'YOURAWSSECRETKEY', // Your secret Key
);

testFunctions() async {
  await testFileUpload(); // This tests the file upload

  await testMultipartUpload(); // Test mulltipart upload

  await testResumeMultipartUpload(); //  Test resuming multipart upload

  await testDownload(); // Test download

  await testResumeDownload(); // Test resume download
}

Future testResumeDownload() async {
  //This tests uploading of a file
  String filePath = p.join(Directory.current.path, 'test_download.mp4');

  String fileUrl = 'file/ftest.mp4'; // The Url of the file in the bucket

  //Create a download config...
  //The download config contains all the configurations needed by the downloader to download the file
  DownloadFileConfig config = DownloadFileConfig(
    credentailsConfig: credentialsConfig,
    url: fileUrl,
    resumeDownload:
        true, // Set resume download to true if download is to be resumed
    downloadPath: filePath, // The file path of the file to be resumed
  );

  DownloadFile downloadFile = DownloadFile(
    config: config,
    onRecieveProgress: ((totalDownloaded, totalSize) =>
        print('Upload Status Callback ===> $totalDownloaded/$totalSize')),
    errorCallback: (errorMessage) => print('An error occurred $errorMessage'),
  ); // Create  a download file instance

  bool prepSuccessful =
      await downloadFile.prepareDownload(); // Prepate the download
  print('The download was prepared Successfully $prepSuccessful');

  downloadFile.downloadProgress.listen((event) {
    //You can listen to the download progress
    print('Upload Status Stream ===> ${event[0]}/${event[1]}');
  });

  if (prepSuccessful) {
    await downloadFile.download().then((value) {
      downloadFile.dispose();
    });
  }
}

Future testDownload() async {
  //Initiate a new upload
  String filePath = p.join(Directory.current.path, 'test_download.mp4');

  String fileUrl = 'file/ftest.mp4'; //The file URl in the bucket

  DownloadFileConfig config = DownloadFileConfig(
    credentailsConfig: credentialsConfig,
    url: fileUrl,
    downloadPath: filePath,
  );

  DownloadFile downloadFile = DownloadFile(
    config: config,
    onRecieveProgress: ((totalDownloaded, totalSize) =>
        print('Upload Status Callback ===> $totalDownloaded/$totalSize')),
    errorCallback: (errorMessage) => print('An error occurred $errorMessage'),
  );

  bool prepSuccessful = await downloadFile.prepareDownload();
  print('The download was prepared Successfully $prepSuccessful');

  downloadFile.downloadProgress.listen((event) {
    print('Upload Status Stream ===> ${event[0]}/${event[1]}');
  });

  if (prepSuccessful) {
    await downloadFile.download().then((value) {
      downloadFile.dispose();
    });
  }
}

Future testResumeMultipartUpload() async {
  String imageName = 'test.mp4'; //tHE Name of the file to be uploaded
  File file = File(p.join(Directory.current.path, 'test_files', imageName));

  //EtagLists is a list of the etags that have been uploaded.
  //For every chunk uploaded to aws, an Etag id is returned.
  //The package has a method that returns all the uploaded etag lists everytime a chunk upload was successful
  final eTagLists = [
    [2, "1ee28a7ac06786aff26d47298674c847"],
    [1, "18cc73a82389202aa085ee5751666726"],
    [4, "bf41ee73393dbfa1a5327fbb50aff054"],
    [5, "2848ec759573e3c5f6cadf1145e9efd9"]
  ];

  //The version id of the upload id is the unique id given to this upload when the upload was started
  final versionIdOrUploadId =
      'Zm9F2QhTuSZQHhnw1O8sThNk9fZ71lAUf20oTUQ11NrUaQy5DUwZ8oZ7fXuxCZywyY8mwUqsa54M3yg1S2QFIWGV.kv_QiMAxGlNHC55OAzBlDIusdJJ2jLF7qaQk9yg';

  //Create the config object.
  MultipartUploadConfig config = MultipartUploadConfig(
    credentailsConfig: credentialsConfig,
    file: file,
    url: 'file/f$imageName',
    resumeMultipart: true,
    versionId: versionIdOrUploadId,
    etagsLists: eTagLists,
  );

  MultipartFileUpload multipartFileUpload = MultipartFileUpload(
    config: config,

    onError: (error, list, s) {
      print('An error occurred $error');
    },

    //The function onVersionIdCreated is called when the version id is just created.
    //Since the version is always just created for a new multipart upload, It is basically only
    //Needed when a new Multipart upload is done.
    //The version id is a parameter. The version id can be cached for further use.
    //The ball is in your court to do anything with the version id.
    onVersionIdCreated: (versionId) => print('version id created $versionId'),

    //Th e
    onPartUploadComplete: (etagList, versionId) => print(
        'Part upload completed ---> etagList is $etagList and versionId is $versionId'),
    onUploadComplete: (etagList, versionId) => print(
        'Part upload completed ---> etagList is $etagList and versionId is $versionId'),
  );

  multipartFileUpload.uploadCompletedState.listen((event) {
    //Event is a boolean. This is true when the file upload is done
    print('Upload State $event');
  });

  multipartFileUpload.uploadProgress.listen((event) {
    print('Upload progress \n${event[0]} / ${event[1]}');
  });

  bool preparingSuccessful =
      await multipartFileUpload.prepareMultipartRequest();

  if (preparingSuccessful) {
    await multipartFileUpload.upload();
  }
}

Future testMultipartUpload() async {
  String imageName = 'test.mp4';
  File file = File(p.join(Directory.current.path, 'test_files', imageName));

  MultipartUploadConfig config = MultipartUploadConfig(
    file: file,
    url: 'file/f$imageName',
    credentailsConfig: credentialsConfig,
  );

  MultipartFileUpload multipartFileUpload = MultipartFileUpload(
    config: config,
    onError: (error, list, s) {
      print('An error occurred $error');
    },

    //The function onVersionIdCreated is called when the version id is just created.
    //Since the version is always just created for a new multipart upload, It is basically only
    //Needed when a new Multipart upload is done.
    //The version id is a parameter. The version id can be cached for further use.
    //The ball is in your court to do anything with the version id.
    onVersionIdCreated: (versionId) => print('version id created $versionId'),

    //Th e
    onPartUploadComplete: (etagList, versionId) => print(
        'Part upload completed ---> etagList is $etagList and versionId is $versionId'),
    onUploadComplete: (etagList, versionId) => print(
        'Part upload completed ---> etagList is $etagList and versionId is $versionId'),
  );

  multipartFileUpload.uploadCompletedState.listen((event) {
    //Event is a boolean. This is true when the file upload is done
    print('Upload State $event');
  });

  multipartFileUpload.uploadProgress.listen((event) {
    print('Upload progress \n${event[0]} / ${event[1]}');
  });

  bool preparingSuccessful =
      await multipartFileUpload.prepareMultipartRequest();

  if (preparingSuccessful) {
    await multipartFileUpload.upload();
  }
}

Future testFileUpload() async {
  File file = File(p.join(Directory.current.path, 'web.pdf'));

  print(file.lengthSync());

  UploadTaskConfig config = UploadTaskConfig(
      credentailsConfig: credentialsConfig,
      url: 'file/web23.pdf',
      uploadType: UploadType.file,
      file: file);

  UploadFile uploadFile = UploadFile(config: config);

  uploadFile.uploadProgress.listen((event) {
    print('${event[0]}/ ${event[1]}');
  });

  await uploadFile.upload().then((value) {
    print(value);
    uploadFile.dispose();
  });
}

Future testUploadObject() async {
  String url = r'testfile.text';

  UploadTaskConfig config = UploadTaskConfig(
      credentailsConfig: credentialsConfig,
      url: url,
      uploadType: UploadType.stringObject,
      content: 'Welcome to Amazon S3. agaian ana diwofofw ans');

  final UploadObject uploadObject = UploadObject(config: config);

  await uploadObject.upload();
}

About

Dart SDK to handle download and Uploads to AWS S3 service. Add resume download and Multipart Upload for Large files

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages