【问题标题】:Problem using FormData and MultiFormData for send Files Images in Flutter with Dio使用 FormData 和 MultiFormData 在 Flutter with Dio 中发送文件图像的问题
【发布时间】:2020-08-02 01:19:49
【问题描述】:

有人在使用 Dio 并发送“MultiPart FormData”时遇到此错误吗?

FormData formData = FormData.fromMap({
  "target_value": listaDados[0],
  "number_installments": listaDados[1],
  "installments_frequency": listaDados[2],
  "modality": listaDados[3],
  "gross_billing": listaDados[4],
  "hectare_cost": listaDados[5],
  "files": [
    MultipartFile.fromFile("${listaDados[6]}",
        filename: "Foto_Identidade"),
    MultipartFile.fromFile("${listaDados[7]}",
        filename: "Foto_Imposto.jpg"),
    MultipartFile.fromFile("${listaDados[8]}",
        filename: "Selfie_Autorizacao.jpg"),
  ]
});
//dio.options.baseUrl = "${global.CONEXAO}";
dio.interceptors.add(LogInterceptor());
response = await dio.post("${global.CONEXAO}/credits",
    data: await formData,
    options: Options(headers: {
      'Authorization':
          'Bearer $token'
    }));
print(response.data);

当我这样发送时,它给出状态 200,发送所有数据,但文件是 [] ....

如果我将 await 放在 MultiPart.fromfile 之前,它会给出错误 500 和 [MapEntry (files []: 'MultipartFile' 的实例)、MapEntry (files []: 'MultipartFile' 的实例)、 MapEntry (files [ ]: 'MultipartFile' 的实例)] ...

  • 这些照片是使用 imagePicker 拍摄的并保存在流中!

  • 确实有一个文件,我事先打印了列表并显示了文件的路径和名称! 有谁知道我能做什么?谢谢

【问题讨论】:

    标签: flutter multipartform-data dio


    【解决方案1】:

    我今天也遇到了同样的问题,因为map在后台获取了相同的key,所以最终无法获取所有文件,所以我将源代码改成如下:

      FormData.fromMap(Map<String, dynamic> map) {
    _init();
    encodeMap(
      map,
      (key, value) {
        if (value == null) return null;
        if (value is MultipartFile) {
          files.add(MapEntry( value.filename, value)); //here is what I changed
        } else {
          fields.add(MapEntry(key, value.toString()));
        }
        return null;
      },
      encode: false,
    );
    

    }

    当我更改源代码并重建我的应用程序时,一切正常,我可以使用文件名作为键。

    如果你深入encodeMap源代码,你会发现dio使用递归来获取所有key,value的entry

    但是当来到 List 中的 MultipartFile 时,这个递归的 Entrance 是 urlEncode(data, ''); 路径是空的,最后得到类似 '$path$leftBracket${(sub[i] is Map || sub[i] is List) ? i : ''}$rightBracket'); 的东西,原来是这样的

    ImmutableMultiDict([('files[]', <FileStorage: 'image_picker677442617592930907_compressed1516097521471936562.jpg' ('application/octet-stream')>), ('files[]', <FileStorage: 'image_picker5187767999094318232_compressed6097930966098340000.jpg' ('application/octet-stream')>)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2021-08-17
      • 2016-12-19
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多