如何在Dart与Flutter中实现文件上传和下载功能

如何在Dart与Flutter中实现文件上传和下载功能?具体需要哪些依赖库和权限配置?能否提供一个完整的代码示例,包括前端界面和后端处理逻辑?在文件上传过程中如何显示进度条,下载时如何实现断点续传?不同平台(iOS/Android/Web)的实现是否有差异?如何处理大文件上传可能出现的超时或内存问题?

3 回复

要实现文件上传和下载功能,首先确保环境已安装Dart和Flutter。

1. 文件上传 使用http包发送POST请求。先创建一个Dart类来处理上传逻辑:

import 'dart:io';
import 'package:http/http.dart' as http;

Future<String> uploadFile(String filePath) async {
  var request = http.MultipartRequest('POST', Uri.parse('https://your-api-endpoint.com/upload'));
  request.files.add(await http.MultipartFile.fromPath('file', filePath));
  
  var response = await request.send();
  if (response.statusCode == 200) {
    return 'Upload successful';
  } else {
    return 'Upload failed';
  }
}

调用时传入文件路径即可。

2. 文件下载 同样用http包获取文件流并保存到本地:

Future<void> downloadFile(String url, String savePath) async {
  var response = await http.get(Uri.parse(url));

  File file = File(savePath);
  await file.writeAsBytes(response.bodyBytes);
  print('Downloaded file to $savePath');
}

以上代码展示了基本的上传和下载功能,实际项目中需处理异常、进度条显示等细节。

更多关于如何在Dart与Flutter中实现文件上传和下载功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


以下是一个简单的 Dart 和 Flutter 实现文件上传和下载功能的示例:

  1. 文件上传:使用 http 包发送 POST 请求上传文件。
import 'dart:io';
import 'package:http/http.dart' as http;

Future<String> uploadFile(File file) async {
  var request = http.MultipartRequest('POST', Uri.parse('https://example.com/upload'));
  request.files.add(http.MultipartFile(
    'file', 
    file.readAsBytes().asStream(), 
    file.lengthSync(),
    filename: file.path.split('/').last
  ));
  var response = await request.send();
  return response.statusCode == 200 ? 'Upload Successful' : 'Upload Failed';
}
  1. 文件下载:使用 flutter_downloader 插件实现下载功能。

在 pubspec.yaml 添加依赖:

dependencies:
  flutter_downloader: ^1.7.0

代码示例:

import 'package:flutter_downloader/flutter_downloader.dart';

Future<void> downloadFile(String url, String fileName) async {
  final taskId = await FlutterDownloader.enqueue(
    url: url,
    savedDir: '/storage/emulated/0/Download',
    showNotification: true,
    openFileFromNotification: true,
  );
}

注意事项:

  • 确保 Android 配置了存储权限。
  • iOS 需要设置 URL Scheme 和 entitlements 文件支持后台下载。

Dart与Flutter文件上传下载功能教程

文件上传

使用http包上传文件

import 'dart:io';
import 'package:http/http.dart' as http;

Future<void> uploadFile(File file, String url) async {
  var request = http.MultipartRequest('POST', Uri.parse(url));
  
  // 添加文件
  request.files.add(
    await http.MultipartFile.fromPath(
      'file', // 字段名
      file.path,
    ),
  );
  
  // 发送请求
  var response = await request.send();
  
  if (response.statusCode == 200) {
    print('上传成功');
  } else {
    print('上传失败');
  }
}

使用dio包上传文件(更推荐)

import 'package:dio/dio.dart';

Future<void> uploadFileWithDio(File file, String url) async {
  var dio = Dio();
  var formData = FormData.fromMap({
    'file': await MultipartFile.fromFile(file.path),
  });
  
  var response = await dio.post(url, data: formData);
  
  if (response.statusCode == 200) {
    print('上传成功');
  } else {
    print('上传失败');
  }
}

文件下载

使用http包下载文件

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';

Future<void> downloadFile(String url, String fileName) async {
  var response = await http.get(Uri.parse(url));
  
  if (response.statusCode == 200) {
    Directory appDocDir = await getApplicationDocumentsDirectory();
    String filePath = '${appDocDir.path}/$fileName';
    
    File file = File(filePath);
    await file.writeAsBytes(response.bodyBytes);
    
    print('文件已保存到: $filePath');
  } else {
    print('下载失败');
  }
}

使用dio包下载文件(支持进度显示)

import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';

Future<void> downloadFileWithDio(String url, String fileName, 
    Function(int, int)? onProgress) async {
  var dio = Dio();
  Directory appDocDir = await getApplicationDocumentsDirectory();
  String savePath = '${appDocDir.path}/$fileName';
  
  await dio.download(
    url,
    savePath,
    onReceiveProgress: onProgress,
  );
  
  print('文件已保存到: $savePath');
}

注意事项

  1. 添加必要的权限:

    • Android: 在AndroidManifest.xml中添加网络和存储权限
    • iOS: 在Info.plist中添加网络权限
  2. 依赖包需要在pubspec.yaml中添加:

dependencies:
  http: ^0.13.5
  dio: ^4.0.6
  path_provider: ^2.0.11
  1. 对于大文件下载,建议使用dio包,因为它支持进度回调
回到顶部