对比过好几个上传下载包,发现还是dio比较好用,使用起来稳定并且还自带进度回调函数支持。
dio的依赖:
dependencies: dio: 3.0.8
dio包的导入:
import 'package:dio/dio.dart';
对于dio的文件上传和下载的代码封装如下:
//文件下载 //url 下载的地址 //progressCallback 下载进度变化时的回调,用来实现进度条 Future<Response> dioDownload(String url, progressCallback) async { Dio dio = Dio(); CancelToken cancelToken = CancelToken();//可以用来取消操作 String docPath = await Application.fileUtil.getDocPath();//获取document目录 String file = docPath + '/' + Application.util.guid() + extension(url);//本地文件名 Response response = await dio.download(url, file, onReceiveProgress: progressCallback == null ? null : (int count, int total) { if (total == -1) { //不知道进度的默认50% total = count * 2; } progressCallback(count, total, cancelToken); }, cancelToken: cancelToken); response.extra = <String, dynamic>{"localPath": file}; return response; } //文件上传 //url - 上传的地址 //filePath - 本地文件路径 //progressCallback - 上传进度变化时的回调,用来实现进度条 Future<Response> dioUpload(String url, String filePath, {Map<String, String> headers = const {}, Map<String, String> body = const {}, Function progressCallback}) async { Map<String, dynamic> data = Map.of(body); //print(basename(filePath)); data['uploadFile'] = await MultipartFile.fromFile(filePath, filename: basename(filePath), contentType: Request.getMediaType(extension(filePath))); FormData formData = FormData.fromMap(data);//form data上传文件 Dio dio = new Dio(); CancelToken cancelToken = CancelToken(); Response resp = await dio.post(url, data: formData, options: Options(headers: headers), onSendProgress: (int count, int data) { progressCallback(count, data, cancelToken); }); if (resp.statusCode == 200) { return resp; } else { throw new Exception("网络访问错误"); } }