Flutter 管理文件上传和下载主要依赖网络请求库和文件操作插件,以下是核心方法:
1. 文件上传
使用 http 或 dio 库(推荐 dio,功能更强大):
import 'package:dio/dio.dart';
import 'package:file_picker/file_picker.dart';
// 选择文件
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
PlatformFile file = result.files.first;
// 创建 FormData
FormData formData = FormData.fromMap({
'file': await MultipartFile.fromFile(file.path!),
});
// 发送请求
Dio dio = Dio();
Response response = await dio.post(
'https://your-upload-url',
data: formData,
onSendProgress: (sent, total) {
print('进度: ${(sent / total * 100).toStringAsFixed(0)}%');
},
);
print(response.data);
}
2. 文件下载
使用 dio 下载并配合 path_provider 保存:
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
void downloadFile(String url, String filename) async {
Dio dio = Dio();
String dir = (await getApplicationDocumentsDirectory()).path;
String savePath = '$dir/$filename';
await dio.download(
url,
savePath,
onReceiveProgress: (received, total) {
if (total != -1) {
print('进度: ${(received / total * 100).toStringAsFixed(0)}%');
}
},
);
print('文件保存至: $savePath');
}
关键点:
- 权限配置:Android 需在
AndroidManifest.xml 添加网络权限 <uses-permission android:name="android.permission.INTERNET" />,iOS 需在 Info.plist 配置 NSAppTransportSecurity。
- 进度监听:通过
onSendProgress(上传)和 onReceiveProgress(下载)回调实时更新进度条。
- 文件选择:使用
file_picker 插件跨平台选择文件。
- 存储路径:通过
path_provider 获取应用文档目录,避免权限问题。
推荐组合:
- 网络请求:
dio(支持拦截器、进度、取消等)
- 文件选择:
file_picker
- 本地存储:
path_provider + dart:io
这种方案覆盖了大多数上传下载场景,且能轻松实现进度显示和错误处理。