[Dart] Flutter 上传文件

   2023-02-08 学习力0
核心提示:/** * 请求响应数据 */class MsgResponse {int code; // 状态代码,0 表示没有错误Object data; // 数据内容,一般为字符串String errmsg; // 错误消息MsgResponse([this.code = 0, this.data = null, this.errmsg = ""]);}static Map _makeHttpHeaders([Stri
/**
 * 请求响应数据
 */
class MsgResponse {
  int code; // 状态代码,0 表示没有错误
  Object data; // 数据内容,一般为字符串
  String errmsg; // 错误消息
  MsgResponse([this.code = 0, this.data = null, this.errmsg = ""]);
}

static Map _makeHttpHeaders(
      [String contentType,
      String accept,
      String token,
      String XRequestWith,
      String XMethodOverride]) {
    Map headers = new Map<String, String>();
    int i = 0;

    if (!strIsEmpty(contentType)) {
      i++;
      headers["Content-Type"] = contentType;
    }

    if (!strIsEmpty(accept)) {
      i++;
      headers["Accept"] = accept;
    }

    if (!strIsEmpty(token)) {
      i++;
      headers["Authorization"] = "bearer " + token;
    }

    if (!strIsEmpty(XRequestWith)) {
      i++;
      headers["X-Requested-With"] = XRequestWith;
    }

    if (!strIsEmpty(XMethodOverride)) {
      i++;
      headers["X-HTTP-Method-Override"] = XMethodOverride;
    }

    if (i == 0) return null;
    // print(headers.toString());
    return headers;
  }



/** HTTP POST 上传文件 */
  static Future<MsgResponse> httpUploadFile(
    final String url,
    final File file, {
    String accept = "*/*",
    String token,
    String field = "picture-upload",
    String file_contentType, // 默认为null,自动获取
  }) async {
    try {
      List<int> bytes = await file.readAsBytes();
      return await httpUploadFileData(url, bytes,
          accept: accept,
          token: token,
          field: field,
          file_contentType: file_contentType,
          filename: file.path);
    } catch (e) {
      return new MsgResponse(699, null, e.toString());
    }
  }

  /** HTTP POST 上传文件 */
  static Future<MsgResponse> httpUploadFileData(
    final String url,
    final List<int> filedata, {
    String accept = "*/*",
    String token,
    String field = "picture-upload",
    String file_contentType, // 默认为null,自动获取
    String filename,
  }) async {
    try {
      List<int> bytes = filedata;
      var boundary = _boundaryString();
      String contentType = 'multipart/form-data; boundary=$boundary';
      Map headers =
          _makeHttpHeaders(contentType, accept, token); //, "XMLHttpRequest");

      // 构造文件字段数据
      String data =
          '--$boundary\r\nContent-Disposition: form-data; name="$field"; ' +
              'filename="${getFileFullName(filename)}"\r\nContent-Type: ' +
              '${(file_contentType == null) ? getMediaType(getFileExt(filename).toLowerCase()): file_contentType}\r\n\r\n';
      var controller = new StreamController<List<int>>(sync: true);
      controller.add(data.codeUnits);
      controller.add(bytes);
      controller.add("\r\n--$boundary--\r\n".codeUnits);

      controller.close();
      bytes = await new Http.ByteStream(controller.stream).toBytes();
      //print("bytes: \r\n" + UTF8.decode(bytes, allowMalformed: true));

      Http.Response response =
          await Http.post(url, headers: headers, body: bytes);
      if (response.statusCode == 200) {
        return new MsgResponse(0, response.body);
      } else
        return new MsgResponse(response.statusCode, response.body);
    } catch (e) {
      return new MsgResponse(699, null, e.toString());
    }
  }

  /** 生成随机字符串 */
  static String randomStr(
      [int len = 8, List<int> chars = _BOUNDARY_CHARACTERS]) {
    var list = new List<int>.generate(
        len, (index) => chars[_random.nextInt(chars.length)],
        growable: false);
    return new String.fromCharCodes(list);
  }

  static const List<int> _BOUNDARY_CHARACTERS = const <int>[
    0x30,
    0x31,
    0x32,
    0x33,
    0x34,
    0x35,
    0x36,
    0x37,
    0x38,
    0x39,
    0x61,
    0x62,
    0x63,
    0x64,
    0x65,
    0x66,
    0x67,
    0x68,
    0x69,
    0x6A,
    0x6B,
    0x6C,
    0x6D,
    0x6E,
    0x6F,
    0x70,
    0x71,
    0x72,
    0x73,
    0x74,
    0x75,
    0x76,
    0x77,
    0x78,
    0x79,
    0x7A,
    0x41,
    0x42,
    0x43,
    0x44,
    0x45,
    0x46,
    0x47,
    0x48,
    0x49,
    0x4A,
    0x4B,
    0x4C,
    0x4D,
    0x4E,
    0x4F,
    0x50,
    0x51,
    0x52,
    0x53,
    0x54,
    0x55,
    0x56,
    0x57,
    0x58,
    0x59,
    0x5A
  ];
  static const int _BOUNDARY_LENGTH = 48;
  static final Random _random = new Random();
  static String _boundaryString() {
    var prefix = "---DartFormBoundary";
    var list = new List<int>.generate(
        _BOUNDARY_LENGTH - prefix.length,
        (index) =>
            _BOUNDARY_CHARACTERS[_random.nextInt(_BOUNDARY_CHARACTERS.length)],
        growable: false);
    return "$prefix${new String.fromCharCodes(list)}";
  }

  static MediaType getMediaType(final String fileExt) {
    switch (fileExt) {
      case ".jpg":
      case ".jpeg":
      case ".jpe":
        return new MediaType("image", "jpeg");
      case ".png":
        return new MediaType("image", "png");
      case ".bmp":
        return new MediaType("image", "bmp");
      case ".gif":
        return new MediaType("image", "gif");
      case ".json":
        return new MediaType("application", "json");
      case ".svg":
      case ".svgz":
        return new MediaType("image", "svg+xml");
      case ".mp3":
        return new MediaType("audio", "mpeg");
      case ".mp4":
        return new MediaType("video", "mp4");
      case ".htm":
      case ".html":
        return new MediaType("text", "html");
      case ".css":
        return new MediaType("text", "css");
      case ".csv":
        return new MediaType("text", "csv");
      case ".txt":
      case ".text":
      case ".conf":
      case ".def":
      case ".log":
      case ".in":
        return new MediaType("text", "plain");
    }
    return null;
  }

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Dart空安全的底层原理与适配
    Dart空安全的底层原理与适配
    一、在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null。从类型理论的角度来说,Null 类型被看作是所有类型的子类;   类型会定义一些操作对象,包括 getters、setters、方法和操作符,在表达式中使用。如果是 List 类型,您可
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • oogle的“ JavaScript杀手” Dart 与JavaScript的比较
    oogle的“ JavaScript杀手” Dart 与JavaScript
    JavaScript通常被称为浏览器脚本语言,但它也已扩展到许多服务器端和移动应用程序开发环境。JS已经存在了将近20年,可以肯定地说它确实是一种成熟且稳定的编程语言。在Facebook发布React和React Native框架之后,JS变得越来越流行。JavaScript具有自己的软件
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • flutter 填坑之旅(dart学习笔记篇)
    flutter 填坑之旅(dart学习笔记篇)
    俗话说 ‘工欲善其事必先利其器’ 想要撸flutter app 而不懂 dart 那就像一个不会英语的人在和英国人交流,懵!安装 dart 就不用说了,比较简单dart 官网 https://dart.dev/安装完成后就开启学习dart 旅程吧…一、 首先得找个ide (总不能使用记事本撸吧),所
    03-08
  • dart 命令行
       dart build 
    02-09
  • dart系列之:dart语言中的异常 dart新手的错误
    目录简介Exception和ErrorThrow和catchFinally总结简介Exception是程序中的异常情况,在JAVA中exception有checked Exception和unchecked Exception。那么在dart中的情况是不是一样的呢?一起来看看吧。Exception和ErrorDart中表示异常的类有两个,分别是Excep
    02-09
点击排行