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()