Flutter Uploader

一个用于创建和管理上传任务的插件。支持 iOS 和 Android。

该插件基于 Android 的 WorkManager 和 iOS 的 NSURLSessionUploadTask,可在后台模式下运行上传任务。

该插件受 flutter_downloader 启发。感谢 Hung Duy Ha 和 Flutter 社区提供的优秀插件和灵感。

iOS 集成

  • 启用后台模式。

AppDelegate 更改

该插件支持后台隔离。为了让插件正常工作,您需要按如下方式调整您的 AppDelegate

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.
  }
}

可选配置

  • 配置每个主机的最大连接数:插件默认允许每个主机同时进行 3 次 http 连接。您可以通过将以下代码添加到您的 Info.plist 文件来更改此数字。
<!-- changes this number to configure the maximum number of concurrent tasks -->
<key>FUMaximumConnectionsPerHost</key>
<integer>3</integer>
  • 配置最大并发上传操作数:插件默认允许同时进行 3 次上传操作。您可以通过将以下代码添加到您的 Info.plist 文件来更改此数字。
<!-- changes this number to configure the maximum number of concurrent tasks -->
<key>FUMaximumUploadOperation</key>
<integer>3</integer>
  • 配置请求超时:控制任务在放弃之前等待额外数据到达的时间(以秒为单位)Info.plist 文件。
<!-- changes this number to configure the request timeout -->
<key>FUTimeoutInSeconds</key>
<integer>3600</integer>

Android 集成

可选配置

  • 配置最大并发任务数:该插件依赖于 WorkManager 库,而 WorkManager 依赖于可用处理器数量来配置当前运行的最大任务数。您可以通过将以下代码添加到您的 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">
     <!-- changes this number to configure the maximum number of concurrent tasks -->
     <meta-data
         android:name="com.bluechilli.flutterupload.MAX_CONCURRENT_TASKS"
         android:value="3" />

     <!-- changes this number to configure connection timeout for the upload http request -->
     <meta-data android:name="com.bluechilli.flutteruploader.UPLOAD_CONNECTION_TIMEOUT_IN_SECONDS" android:value="3600" />
 </provider>

用法

导入包

import 'package:flutter_uploader/flutter_uploader.dart';

配置后台隔离入口点

首先,定义一个顶级函数

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
  });
}

backgroundHandler 函数需要是静态函数或顶级函数,才能作为 Flutter 入口点访问。

定义好函数后,像这样在您的主 FlutterUploader 对象中配置它

FlutterUploader().setBackgroundHandler(backgroundHandler);

要了解所有内容的工作原理,请查看示例。

创建新的上传任务

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
  ),
);

二进制上传

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
  ),
);

该插件将返回一个唯一的 taskId,用于每个上传。如果您想取消特定的上传,请保留此 ID。

监听上传进度

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

监听上传结果

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

当任务被取消时,它将作为异常发送到 onError 处理程序,状态为 cancelled。

上传结果由插件持久化,并且将在每次 .listen 时提交。
建议您在 App 端维护一个已处理上传的列表,并在它们可以被移除时调用 FlutterUploader 插件上的 clearUploads

取消上传任务

FlutterUploader().cancel(taskId: taskId);

取消所有上传任务

FlutterUploader().cancelAll();

清除上传

FlutterUploader().clearUploads()

GitHub

https://github.com/fluttercommunity/flutter_uploader