Flutter如何管理文件上传下载

在Flutter中如何实现文件的上传和下载功能?需要支持断点续传和进度显示,有没有推荐的插件或最佳实践?同时希望能处理不同平台(iOS/Android)的文件路径差异问题。

2 回复

Flutter使用Dart的http包或dio库处理文件上传下载。上传通过multipart/form-data发送文件,下载使用流式写入本地存储。需注意权限和存储路径管理。

更多关于Flutter如何管理文件上传下载的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter 管理文件上传和下载主要依赖网络请求库和文件操作插件,以下是核心方法:

1. 文件上传 使用 httpdio 库(推荐 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

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

回到顶部