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
这种方案覆盖了大多数上传下载场景,且能轻松实现进度显示和错误处理。