如何在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 实现文件上传和下载功能的示例:
- 文件上传:使用 
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';
}
- 文件下载:使用 
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');
}
注意事项
- 
添加必要的权限:
- Android: 在
AndroidManifest.xml中添加网络和存储权限 - iOS: 在
Info.plist中添加网络权限 
 - Android: 在
 - 
依赖包需要在
pubspec.yaml中添加: 
dependencies:
  http: ^0.13.5
  dio: ^4.0.6
  path_provider: ^2.0.11
- 对于大文件下载,建议使用
dio包,因为它支持进度回调 
        
      
            
            
            
