flutter 網絡請求,上傳文件,下載文件

1.開發環境Android studio 3.4.0
2.pubspec.yaml添加依賴如下:

  dio: ^3.0.0 # HTTP網絡請求
  crypto: ^2.1.3 #加密 md5 sha1 HMAC(i.e. HMAC-MD5, HMAC-SHA1, HMAC-SHA256)等
  shared_preferences: ^0.5.0 # 添加sharedPreference依賴
  path_provider: ^1.6.5 #文件讀寫
  sqflite: ^1.3.0 #數據庫存儲
  permission_handler: ^4.1.0 #權限管理
  file_picker: ^1.4.3+2 #文件選擇
  cached_network_image: ^2.0.0 #圖片選擇
  common_utils: ^1.1.3 # 精度

3.網絡請求類

import 'package:common_utils/common_utils.dart';
import 'package:dio/dio.dart';
import 'urls.dart';

class HttpReqUtil {
  Dio dio = null;

  HttpReqUtil._() {
    dio = new Dio();
    // 添加攔截器
    dio.interceptors
        .add(InterceptorsWrapper(onRequest: (RequestOptions options) {
      print("\n================== 請求數據 ==========================");
      print("url = ${options.uri.toString()}");
      print("headers = ${options.headers}");
      print("params = ${options.data}");
    }, onResponse: (Response response) {
      print("\n================== 響應數據 ==========================");
      print("code = ${response.statusCode}");
      print("data = ${response.data}");
      print("\n");
    }, onError: (DioError e) {
      print("\n================== 錯誤響應數據 ======================");
      print("type = ${e.type}");
      print("message = ${e.message}");
      print("stackTrace = ${e.error}");
      print("\n");
    }));
  }

  static HttpReqUtil dbUtils;

  static HttpReqUtil getInstance() {
    if (null == dbUtils) dbUtils = HttpReqUtil._();
    return dbUtils;
  }

  Future<Response> getData(String url) async {
    return await dio.get(url);
  }

  Future<Response> postForm(String url, Map<String, Object> params) async {
    var option = Options(
        method: "POST", contentType: "application/x-www-form-urlencoded");
    return await dio.post(url, data: params, options: option);
  }

  Future<Response> postJson(String url, Map<String, Object> params) async {
    var option = Options(method: "POST", contentType: "application/json");
    return await dio.post(url, data: params, options: option);
  }

  /**
   * 上傳文件
   * 注:file是服務端接受的字段字段,如果接受字段不是這個需要修改
   */
  Future<Response> uploadFile(String filePath, String fileName) async {
    var postData = FormData.fromMap(
        {"file": await MultipartFile.fromFile(filePath, filename: fileName)});//file是服務端接受的字段字段,如果接受字段不是這個需要修改
    var option = Options(method: "POST", contentType: "multipart/form-data");//上傳文件的content-type 表單
    return await dio.post(
      UPLOAD_FILE_N,
      data: postData,
      options: option,
      onSendProgress: (int sent, int total) {
        print("上傳進度:" +
            NumUtil.getNumByValueDouble(sent / total * 100, 2)
                .toStringAsFixed(2) +
            "%"); //取精度,如:56.45%
      },
    );
  }

  /**
   * 下載文件
   */
  Future<Response> downloadFile(String resUrl, String savePath) async {
    //還好我之前寫過服務端代碼,不然我根本沒有相對路勁的概念
    return await dio.download(resUrl, savePath,
        onReceiveProgress: (int loaded, int total) {
      print("下載進度:" +
          NumUtil.getNumByValueDouble(loaded / total * 100, 2)
              .toStringAsFixed(2) +
          "%"); //取精度,如:56.45%
    });
  }
}

4.調用方式:

login() async {
    var pwd = sha1.convert(utf8.encode("11111111"));
    HttpReqUtil.getInstance().postForm(LOGIN_N,
        {'username': '156564556', 'password': pwd, 'type': 3}).then((result) {
      print("返回數據:${result.toString()}");
    }).whenComplete(() {
      print("請求結束");
    }).catchError((err) {
      print("請求報錯:" + err.toString());
    });
  }

  uploadFile() async {
  	//文件選擇 [jpg]格式,可以設置更多,權限問題filepicker會幫你處理
    File file = await FilePicker.getFile(
        type: FileType.custom, allowedExtensions: ["jpg"]);
    print("上傳圖片地址:" + file.path);
    var fileName =
        file.path.substring(file.path.lastIndexOf("/") + 1, file.path.length);
    HttpReqUtil.getInstance().uploadFile(file.path, fileName).then((result) {
      print("返回數據:${result.toString()}");
    }).whenComplete(() {
      print("請求結束");
    }).catchError((err) {
      print("請求報錯:" + err.toString());
    });
  }

  downloadFile()async{
    var resUrl = 'http://static.maintenance.v3m2.ettda.com/files/fd/ec/2c/5ebb52dfca8ab0e479f15457/5ebb52dfca8ab0e479f15457.jpg';
    await getTemporaryDirectory().then((result){//獲取臨時存放路徑
      HttpReqUtil.getInstance().downloadFile(resUrl, result.path+"/123.jpg");
    });
  }

5.實現效果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章