Background upload plugin for flutter

Overview

Flutter Community: flutter_uploader

Flutter Uploader

A plugin for creating and managing upload tasks. Supports iOS and Android.

This plugin is based on WorkManager in Android and NSURLSessionUploadTask in iOS to run upload task in background mode.

This plugin is inspired by flutter_downloader. Thanks to Hung Duy Ha & Flutter Community for great plugins and inspiration.

iOS integration

  • Enable background mode.

AppDelegate changes

The plugin supports a background isolate. In order for plugins to work, you need to adjust your AppDelegate as follows:

import flutter_uploader

func registerPlugins(registry: FlutterPluginRegistry) {
    GeneratedPluginRegistrant.register(with: registry)
}

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    SwiftFlutterUploaderPlugin.registerPlugins = registerPlugins

    // Any further code.
  }
}

Optional configuration:

  • Configure maximum number of connection per host: the plugin allows 3 simultaneous http connection per host running at a moment by default. You can change this number by adding following codes to your Info.plist file.

<key>FUMaximumConnectionsPerHostkey>
<integer>3integer>
  • Configure maximum number of concurrent upload operation: the plugin allows 3 simultaneous upload operation running at a moment by default. You can change this number by adding following codes to your Info.plist file.

<key>FUMaximumUploadOperationkey>
<integer>3integer>
  • Configure request timeout: controls how long (in seconds) a task should wait for additional data to arrive before giving up Info.plist file.

<key>FUTimeoutInSecondskey>
<integer>3600integer>

Android integration

Optional configuration:

  • Configure maximum number of concurrent tasks: the plugin depends on WorkManager library and WorkManager depends on the number of available processor to configure the maximum number of tasks running at a moment. You can setup a fixed number for this configuration by adding following codes to your AndroidManifest.xml:
">
 <provider
     android:name="androidx.work.impl.WorkManagerInitializer"
     android:authorities="${applicationId}.workmanager-init"
     android:enabled="false"
     android:exported="false" />

 <provider
     android:name="com.bluechilli.flutteruploader.FlutterUploaderInitializer"
     android:authorities="${applicationId}.flutter-upload-init"
     android:exported="false">
     
     <meta-data
         android:name="com.bluechilli.flutterupload.MAX_CONCURRENT_TASKS"
         android:value="3" />

     
     <meta-data android:name="com.bluechilli.flutteruploader.UPLOAD_CONNECTION_TIMEOUT_IN_SECONDS" android:value="3600" />
 provider>

Usage

Import package:

import 'package:flutter_uploader/flutter_uploader.dart';

Configure a background isolate entry point

First, define a top-level function:

void backgroundHandler() {
  // Needed so that plugin communication works.
  WidgetsFlutterBinding.ensureInitialized();

  // This uploader instance works within the isolate only.
  FlutterUploader uploader = FlutterUploader();

  // You have now access to:
  uploader.progress.listen((progress) {
    // upload progress
  });
  uploader.result.listen((result) {
    // upload results
  });
}

The backgroundHandler function needs to be either a static function or a top level function to be accessible as a Flutter entry point.

Once you have a function defined, configure it in your main FlutterUploader object like so:

FlutterUploader().setBackgroundHandler(backgroundHandler);

To see how it all works, check out the example.

Create new upload task:

multipart/form-data:

final taskId = await FlutterUploader().enqueue(
  MultipartFormDataUpload(
    url: "your upload link", //required: url to upload to
    files: [FileItem(path: '/path/to/file', fieldname:"file")], // required: list of files that you want to upload
    method: UploadMethod.POST, // HTTP method  (POST or PUT or PATCH)
    headers: {"apikey": "api_123456", "userkey": "userkey_123456"},
    data: {"name": "john"}, // any data you want to send in upload request
    tag: 'my tag', // custom tag which is returned in result/progress
  ),
);

binary uploads:

final taskId = await FlutterUploader().enqueue(
  RawUpload(
    url: "your upload link", // required: url to upload to
    path: '/path/to/file', // required: list of files that you want to upload
    method: UploadMethod.POST, // HTTP method  (POST or PUT or PATCH)
    headers: {"apikey": "api_123456", "userkey": "userkey_123456"},
    tag: 'my tag', // custom tag which is returned in result/progress
  ),
);

The plugin will return a taskId which is unique for each upload. Hold onto it if you in order to cancel specific uploads.

listen for upload progress

final subscription = FlutterUploader().progress.listen((progress) {
  //... code to handle progress
});

listen for upload result

final subscription = FlutterUploader().result.listen((result) {
    //... code to handle result
}, onError: (ex, stacktrace) {
    // ... code to handle error
});

when tasks are cancelled, it will send on onError handler as exception with status = cancelled

Upload results are persisted by the plugin and will be submitted on each .listen. It is advised to keep a list of processed uploads in App side and call clearUploads on the FlutterUploader plugin once they can be removed.

Cancel an upload task:

FlutterUploader().cancel(taskId: taskId);

Cancel all upload tasks:

FlutterUploader().cancelAll();

Clear Uploads

FlutterUploader().clearUploads()
Comments
  • iOS upload returns 500

    iOS upload returns 500

    Hello!

    I used the bellow function to upload .JPG and .PDF file. It works on Android and it logs the progress too, but in iOS Simulator after 2 seconds it shows the following error: (Also i used .enqueue too but get same result)

    CODE:

    FlutterUploader uploader = FlutterUploader();
    
      await uploader
          .enqueueBinary(
        url:
            "https://******.******.net/api/services/app/BlobManager/UploadMedicalCheckFile",
        file: FileItem(
          filename: file.name,
          savedDir: file.directory,
          fieldname: "File",
        ),
        method: UploadMethod.POST,
        headers: {
          "Authorization": "Bearer ${user.accessToken}",
          "content-type": "application/json",
        },
        showNotification: true,
      )
          .onError((error, stackTrace) {
        print(error);
        print(stackTrace.toString());
        return null;
      }).then((value) => print("DONE!"));
    

    ERROR:

    flutter: DONE! [VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: taskId: chillisource.flutter_uploader.upload.background.4, status:UploadTaskStatus(4), statusCode:500, code:upload_error, message:{"result":null,"targetUrl":null,"success":false,"error":{"code":0,"message":"An internal error occurred during your request!","details":null,"validationErrors":null},"unAuthorizedRequest":false,"__abp":true}}, tag:null 16 libsystem_pthread.dylib 0x00007fff61166467 start_wqthread + 15 15 libsystem_pthread.dylib 0x00007fff61167453 _pthread_wqthread + 244 14 libdispatch.dylib 0x00007fff20116871 _dispatch_worker_thread2 + 102 13 libdispatch.dylib 0x00007fff20116074 _dispatch_root_queue_drain + 350 12 libdispatch.dylib 0x00007fff201080bb _dispatch_async_redirect_invoke + 747 11 libdispatch.dylib 0x00007fff201089fb _dispatch_continuation_pop + 445 10 libdispatch.dylib 0x00007fff20106508 _dispatch_client_ca<…>

    FLUTTER DOCTOR:

    [✓] Flutter (Channel stable, 2.0.1, on macOS 11.2.3 20D91 darwin-x64, locale en) [✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3) [✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [✓] Android Studio (version 4.1) [✓] VS Code (version 1.55.2) [✓] Connected device (2 available)

    bug ios 
    opened by samigimix 11
  • EXC_BAD_ACCESS KERN_INVALID_ADDRESS

    EXC_BAD_ACCESS KERN_INVALID_ADDRESS

    Crashed: chillisource.flutter_uploader.queue (QOS: UNSPECIFIED)
    EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000000
    0  Runner                         0x103049d0c specialized Dictionary.subscript.getter + 4297743628 (<compiler-generated>:4297743628)
    1  Runner                         0x103045f1c SwiftFlutterUploaderPlugin.urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) + 4297727772 (<compiler-generated>:4297727772)
    2  Runner                         0x103046730 @objc SwiftFlutterUploaderPlugin.urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) + 4297729840 (<compiler-generated>:4297729840)
    3  Foundation                     0x1baf709d4 <redacted> + 24
    4  Foundation                     0x1bae724a8 <redacted> + 104
    5  Foundation                     0x1baf72d30 <redacted> + 24
    6  Foundation                     0x1bae72124 <redacted> + 740
    7  Foundation                     0x1baf7375c <redacted> + 24
    8  Foundation                     0x1baf7321c <redacted> + 184
    9  libdispatch.dylib              0x1ba85239c <redacted> + 144
    10 libdispatch.dylib              0x1ba845fd8 <redacted> + 20
    11 libdispatch.dylib              0x1ba848758 <redacted> + 408
    12 libdispatch.dylib              0x1ba847eb8 <redacted> + 596
    13 libdispatch.dylib              0x1ba854bd4 <redacted> + 348
    14 libdispatch.dylib              0x1ba855384 <redacted> + 120
    15 libsystem_pthread.dylib        0x1ba8ab690 _pthread_wqthread + 216
    16 libsystem_pthread.dylib        0x1ba8b19e8 start_wqthread + 8
    

    Device Model: iPhone XR Orientation: Portrait RAM free: 93.88 MB Disk free: 18.26 GB

    Operating System Version: 13.3.1 (17D50) Orientation: Portrait Jailbroken: No

    ios 
    opened by ragnor-rs 9
  • java.lang.IllegalArgumentException: Parameter specified as non-null is null

    java.lang.IllegalArgumentException: Parameter specified as non-null is null

    flutter_uploader: 1.2.0 OS: Android

    This is because MimeTypeMap.getSingleton().getMimeTypeFromExtension("log") is null

    Stack trace

    [  +67 ms] D/UploadWorker( 9033): attaching file: /data/user/0/ru.fl.flmobile/cache/appium.log
    [        ] W/System.err( 9033): java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter $this$toMediaTypeOrNull
    [        ] W/System.err( 9033): 	at okhttp3.MediaType$Companion.parse(MediaType.kt)
    [        ] W/System.err( 9033): 	at okhttp3.MediaType.parse(MediaType.kt)
    [        ] W/System.err( 9033): 	at com.bluechilli.flutteruploader.UploadWorker.doWork(UploadWorker.java:153)
    [        ] W/System.err( 9033): 	at androidx.work.Worker$1.run(Worker.java:85)
    [        ] W/System.err( 9033): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    [        ] W/System.err( 9033): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    [        ] W/System.err( 9033): 	at java.lang.Thread.run(Thread.java:761)
    [   +5 ms] I/WM-WorkerWrapper( 9033): Worker result FAILURE for Work [ id=fee32
    
    bug android 
    opened by ragnor-rs 9
  • Is there support for wi-fi only uploads

    Is there support for wi-fi only uploads

    I know that Android WorkManager supports scheduling uploads for when there is a wi-fi connection. From what I gathered, the NSURLSessionConfiguration also supports restricting the uploads to wi-fi.

    Will support for this be added to the plugin? Would this be more involved than adding a flag to the UploadJob and passing it all the way through to the native side?

    opened by lyio 8
  • uploader.result.listen call twice

    uploader.result.listen call twice

      try {
          final result = await InternetAddress.lookup('google.com');
          if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
            final taskId = await uploader.enqueue(
                url:
                    'https://xxxx',
                files: files,
                data: {
                 ....
                },
                method: UploadMethod.POST,
                showNotification: true,
                tag: title);
    
            final subscription = uploader.result.listen((result) async {
              print("response " + result.response);
            }, onError: (ex, stacktrace) {
              print(ex.toString());
            });
          }
        } catch (e) {
          ...
        }
      }
    

    When first time I call this, uploader.result.listen will only print one. But if I call this method again, uploader.result.listen will call twice. Why?

    opened by tony123S 8
  • Headers Config (Content-Type)

    Headers Config (Content-Type)

    files is failed to upload after set header of content type to "application/octet-stream".

    here is error response below:

    flutter: exception: taskId: chillisource.flutter_uploader.upload.background.5, status:UploadTaskStatus(4), statusCode:400, code:upload_error, message:Error in call to API function "files/upload": Bad HTTP "Content-Type" header: "multipart/form-data; boundary=alamofire.boundary.3b1254f2854aa177,application/octet-stream". Expecting one of "application/octet-stream", "text/plain; charset=dropbox-cors-hack".}, tag:upload

    opened by ainulya16 8
  • [question] How can you pass data to the background handler?

    [question] How can you pass data to the background handler?

    Hi, I have noticed that you are able to specify a background handler, so that it can freely run in an isolate. Though, since Isolates do not share memory, how should you pass data between the main and the background isolate? I need that for localization of the strings and also to keep track of each upload through an integer that increments after each upload.

    Thanks in advance!

    opened by Pato05 7
  • How to get Tag in the result or progress streams

    How to get Tag in the result or progress streams

    Hello,

    I am using version 2.0.0-beta.3 and I would like to use the tag attribute. As stated in the documentation,

    tag: 'my tag', // custom tag which is returned in result/progress
    

    I should be able to access it, and I have tried something like this:

    uploader.result.listen((event) {
           final tag = event.tag;
    });
    

    but it didn't work because UploadTaskResponse has no attribute called tag.

    so the question is how to access it?

    enhancement 
    opened by AhmedNourJamalElDin 7
  • Refactor multiform upload to better implementation and handle uploading large file. this will fix #24, #25, #27

    Refactor multiform upload to better implementation and handle uploading large file. this will fix #24, #25, #27

    • Current multipart form upload implementation has the potential to run out of memory when uploading large files since it loads the whole file into memory and writes to the request file. this PR will attempt to fix that. code has been copied from Alamofire. their multiplatform data has a better implementation.

    • Refactor example app to send the direct video/image path instead of copying and let the platform take care of the rest.

    This should fix with issue #24, #25, #27

    opened by onikiri2007 7
  • The application crashes after trying to upload a file.

    The application crashes after trying to upload a file.

    I add file in enqueue method [look screenshot]
    In previous package version 2.0.0-beta3 everything work fine.

    This code snippet show how I handle download process. But I don't hit the listener breakpoints

    _progressSubscription = _fileUploader.progress.listen((progress) {
          if ((progress.status == UploadTaskStatus.running &&
              progress.progress % 5 == 0) ||
              progress.status != UploadTaskStatus.running) {
            _uploadProgressController.add(UploadFileProgressEvent(
                progress.taskId, progress.status, progress.progress));
          }
        });
    
        _resultSubscription = _fileUploader.result.listen((result) {
          if (result.statusCode < 400) {
            _uploadStatusController.add(UploadFileStatusEvent(
                result.taskId, result.status, json.decode(result.response), false));
          } else {
            _uploadStatusController.add(UploadFileStatusEvent(
                result.taskId, result.status, null, true));
          }
        }, onError: (ex, stacktrace) {
          if (ex != null) {
            _uploadStatusController.add(UploadFileStatusEvent(
                ex.taskId,
                ex.status,
                {
                  'message': ex.message,
                  'code': ex.code,
                  'statusCode': ex.statusCode
                },
                true));
          }
        });
    
    Screenshot 2020-12-24 at 19 18 01 bug android 
    opened by vlkonoshenko 6
  • uploader.result.listen call too many times

    uploader.result.listen call too many times

    uploader.result.listen((result) async { print("response " + result.response); }, onError: (ex, stacktrace) { print(ex.toString()); }); }

    When first time I call this, uploader.result.listen will only print one. But if I call this method again, uploader.result.listen will call almost 10 to 16 times. Why?

    Version 2.0.0-beta.3

    opened by kadnan0900 6
  • Flutter uploader on ios always failing and show such logs

    Flutter uploader on ios always failing and show such logs

    URLSessionDidReceiveData: URLSessionDidCompleteWithError: chillisource.flutter_uploader.upload.background.E6E4B869-3344-4B8F-9D1F-44ECA433057C with response: <NSHTTPURLResponse: 0x283331640> { URL: https://apidevseer.eivolo.com/ } { Status Code: 404, Headers { "Cache-Control" = ( "no-cache, private" ); Connection = ( "keep-alive" ); "Content-Type" = ( "application/json" ); Date = ( "Thu, 05 Jan 2023 08:12:46 GMT" ); Server = ( nginx ); "Transfer-Encoding" = ( Identity ); } } and status: 404 URLSessionDidCompleteWithError: upload completed URLSessionDidCompleteWithError: task: completed statusCode: 404, error:{"success":false,"error":"route_not_found"}, response:Optional(<NSHTTPURLResponse: 0x283331640> { URL: https://apidevseer.eivolo.com/ } { Status Code: 404, Headers { "Cache-Control" = ( "no-cache, private" ); Connection = ( "keep-alive" ); "Content-Type" = ( "application/json" ); Date = ( "Thu, 05 Jan 2023 08:12:46 GMT" ); Server = ( nginx ); "Transfer-Encoding" = ( Identity ); } }) flutter: {"success":false,"error":"route_not_found"} flutter: {"success":false,"error":"route_not_found"} flutter: {"success":false,"error":"route_not_found"} flutter: {"success":false,"error":"route_not_found"}

    opened by wadihhannouch 0
  • Bump express from 4.17.1 to 4.18.2 in /example/backend/functions

    Bump express from 4.17.1 to 4.18.2 in /example/backend/functions

    Bumps express from 4.17.1 to 4.18.2.

    Release notes

    Sourced from express's releases.

    4.18.2

    4.18.1

    • Fix hanging on large stack of sync routes

    4.18.0

    ... (truncated)

    Changelog

    Sourced from express's changelog.

    4.18.2 / 2022-10-08

    4.18.1 / 2022-04-29

    • Fix hanging on large stack of sync routes

    4.18.0 / 2022-04-25

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump qs and express in /example/backend/functions

    Bump qs and express in /example/backend/functions

    Bumps qs and express. These dependencies needed to be updated together. Updates qs from 6.7.0 to 6.11.0

    Changelog

    Sourced from qs's changelog.

    6.11.0

    • [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option (#442)
    • [readme] fix version badge

    6.10.5

    • [Fix] stringify: with arrayFormat: comma, properly include an explicit [] on a single-item array (#434)

    6.10.4

    • [Fix] stringify: with arrayFormat: comma, include an explicit [] on a single-item array (#441)
    • [meta] use npmignore to autogenerate an npmignore file
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, object-inspect, tape

    6.10.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [actions] reuse common workflows
    • [Dev Deps] update eslint, @ljharb/eslint-config, object-inspect, tape

    6.10.2

    • [Fix] stringify: actually fix cyclic references (#426)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [actions] update codecov uploader
    • [actions] update workflows
    • [Tests] clean up stringify tests slightly
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, object-inspect, safe-publish-latest, tape

    6.10.1

    • [Fix] stringify: avoid exception on repeated object values (#402)

    6.10.0

    • [New] stringify: throw on cycles, instead of an infinite loop (#395, #394, #393)
    • [New] parse: add allowSparse option for collapsing arrays with missing indices (#312)
    • [meta] fix README.md (#399)
    • [meta] only run npm run dist in publish, not install
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbols, tape
    • [Tests] fix tests on node v0.6
    • [Tests] use ljharb/actions/node/install instead of ljharb/actions/node/run
    • [Tests] Revert "[meta] ignore eclint transitive audit warning"

    6.9.7

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [Tests] clean up stringify tests slightly
    • [meta] fix README.md (#399)
    • Revert "[meta] ignore eclint transitive audit warning"

    ... (truncated)

    Commits
    • 56763c1 v6.11.0
    • ddd3e29 [readme] fix version badge
    • c313472 [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option
    • 95bc018 v6.10.5
    • 0e903c0 [Fix] stringify: with arrayFormat: comma, properly include an explicit `[...
    • ba9703c v6.10.4
    • 4e44019 [Fix] stringify: with arrayFormat: comma, include an explicit [] on a s...
    • 113b990 [Dev Deps] update object-inspect
    • c77f38f [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, tape
    • 2cf45b2 [meta] use npmignore to autogenerate an npmignore file
    • Additional commits viewable in compare view

    Updates express from 4.17.1 to 4.18.2

    Release notes

    Sourced from express's releases.

    4.18.2

    4.18.1

    • Fix hanging on large stack of sync routes

    4.18.0

    ... (truncated)

    Changelog

    Sourced from express's changelog.

    4.18.2 / 2022-10-08

    4.18.1 / 2022-04-29

    • Fix hanging on large stack of sync routes

    4.18.0 / 2022-04-25

    ... (truncated)

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Is this project dead?

    Is this project dead?

    Looks like this project is abandoned & hasn't been updated in a while. If that please let us know, so we can find other alternatives as I am using this package for production.

    If the maintainer isn't active, I can contribute to keep this project alive. Thank you

    opened by swarupbhc 2
  • Uploading stops if I keep uploading images for more than 30 seconds on IOS.

    Uploading stops if I keep uploading images for more than 30 seconds on IOS.

    I have about 50 images in total uploading to the server in the background, but after about 20 uploads, it goes to over 30 seconds and the upload log stops from there. Is there a workaround for this?

    opened by masal9pse 0
Releases(2.0.0-beta.6)
  • 2.0.0-beta.6(Dec 26, 2020)

  • 2.0.0-beta.5(Dec 22, 2020)

    • Resolves crashes on iOS when using multiple concurrent uploads
    • Additional documentation on results stream
    • Android: Clear "progress" as well when a clearUploads is called
    Source code(tar.gz)
    Source code(zip)
Owner
Flutter Community
A central place for all community made Flutter packages. To get started, see the README of the 'community' repository.
Flutter Community
A Flutter plugin to get location updates in the background for both Android and iOS

Background Location A Flutter plugin to get location updates in the background for both Android and iOS (Requires iOS 10.0+). Uses CoreLocation for iO

Ali Almoullim 181 Jan 4, 2023
A Flutter plugin for updating location in background.

background_locator A Flutter plugin for getting location updates even when the app is killed. Refer to wiki page for install and setup instruction or

REKAB 270 Dec 29, 2022
A Flutter plugin which allows you to execute code in the background on Android and iOS.

Flutter Workmanager Flutter WorkManager is a wrapper around Android's WorkManager, iOS' performFetchWithCompletionHandler and iOS BGAppRefreshTask, ef

Flutter Community 699 Jan 5, 2023
A flutter plugin that brings an in-background android app to the foreground

bg_launcher A flutter plugin that brings an in-background android app to the foreground (Android only) Restrictions on starting activities from the ba

Iheb Briki 5 Nov 25, 2022
flutter upload test

startup_namer codelab part 1 step 3 Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Howard Su 0 Nov 23, 2021
Picture upload widget for Flutter which helps selecting and uploading one or multiple images to firebase storage.

Flutter Firebase Picture Uploader This library offers a Picture Upload widget which can be used to upload one or multiple images to your Firebase Stor

Christoph Rothermel 12 Oct 21, 2022
A file select and upload for flutter

Flutter File Select and Upload - Day 44 class Afgprogrammer extends Flutter100Da

Behruz Hurramov 2 Jul 9, 2022
An app to pick, upload and display images from camera and gallery with size and extension constraints.

image_uploader A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started i

Ehmad Saeed⚡ 4 Mar 7, 2022
Push Notification service for anime episodes and news. The episode updates will be based on actual upload on the internet and NOT Japan tv schedule as other apps do.

Quantz Push Notification service for anime episodes and news. Features Sub and dub - get notified with latest anime episodes on the internet. Ongoing

null 18 Nov 21, 2022
The ArDrive Web App allows a user to log in to securely view, upload and manage their ArDrive files.

ArDrive Web The ArDrive Web App allows a user to log in to securely view, upload and manage their ArDrive files. Have any questions? Join the ArDrive

ArDrive App 36 Dec 14, 2022
SFTP upload App for mobile

Tuma Upload files to SFTP servers. Help The data required to upload files to a specific path on an SFTP server is called a Target. Saved Targets are l

Imran Remtulla 6 Nov 6, 2022
A Flutter project for schedule background task example

Flutter Schedule Background Task A Flutter project for schedule background task example. Getting Started This project is an example to create & execut

null 3 Jul 1, 2022
Create bulk instagram quotes posts with custom background, style, font, size. built using flutter

Mini Canva minicanva.com Bulk Image Generator from given list of quotes, lines ?? Purpose Etsy is an E-commerce platform where we can sell digital goo

Ashish Pipaliya 7 Oct 29, 2022
Automatically generate profile picture with random first name and background color. But you can still provide pictures if you have them. As the default color, based on the name of the first letter. :fire: :fire: :fire:

FLUTTER PROFILE PICTURE Automatically generate profile picture with random first name and background color. But you can still provide pictures if you

Aditya Dharmawan Saputra 10 Dec 20, 2022
dos downloader app is developed for downloading video. You can download video from YouTube and Facebook. You can also play video on background

dosdownloader Dos downloader app is developed for downloading video. You can download video from YouTube and Facebook. You can also play video on back

Md Abir Ahsan Tahmim 1 Dec 8, 2021
App de teste que executa uma função de fibonacci em background utilizando compute.

app_isolate_compute A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you star

Isaque Santos Paixão 0 Jan 7, 2022
Aplicativo de teste que roda em background timer atual utilizando Isolate.

# isolate_app A new Flutter project. ## Getting Started This project is a starting point for a Flutter application. A few resources to get you sta

Isaque Santos Paixão 1 Jun 20, 2022
User onboarding library with smooth animation of objects and background colors

SlidingTutorial Cleveroad introduces Sliding Tutorial Library for Flutter Hey guys, hope you haven’t started developing a tutorial for your Flutter ap

Cleveroad 127 Dec 31, 2022
Schedule & run Dart code in the background on both Android & iOS

flt_worker The flt_worker plugin allows you to schedule and execute Dart-written background tasks in a dedicated isolate, by utilizing the WorkManager

Yingxin Wu 26 Nov 27, 2022