对比过好几个上传下载包,发现还是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("网络访问错误");
  }
}