Dio: flutter 添加图片到formdata出错

Created on 31 May 2018  ·  3Comments  ·  Source: flutterchina/dio

/**
   * 更新用户信息
   */
  Future<Stream<BaseJsonBean>> updateUserInfo(
      File file, String userName, String description) {
    print("file = $file");
    FormData formData = FormData.from({
      "userName": userName,
      "description": description,
      "file": UploadFileInfo(file, "filename.jpg")
    });

    return _dioPut("/users", formData, (json) {
      return BaseJsonBean.fromJson(json);
    });
  }

  Future<Stream<T>> _dioPut<T>(
      var path, FormData formData, T fromJson(dynamic json)) async {
    return _dio
        .put(path, data: formData)
        .then((response) => response.data)
        .then(fromJson)
        .asStream();
  } 

调用方法后报错

I/flutter (16289): file = File: '/storage/emulated/0/Pictures/Screenshots/S80424-171652.jpg'
V/SettingsInterface(16289):  from settings cache , name = sound_effects_enabled , value = 1
E/flutter (16289): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (16289): DioError [DioErrorType.DEFAULT]: Converting object to an encodable object failed: Instance of 'UploadFileInfo'#0      _JsonStringifier.writeObject (dart:convert/json.dart:705:7)
E/flutter (16289): #1      _JsonStringifier.writeMap (dart:convert/json.dart:788:7)
E/flutter (16289): #2      _JsonStringifier.writeJsonValue (dart:convert/json.dart:743:21)
E/flutter (16289): #3      _JsonStringifier.writeObject (dart:convert/json.dart:695:9)
E/flutter (16289): #4      _JsonStringStringifier.printOn (dart:convert/json.dart:904:17)
E/flutter (16289): #5      _JsonStringStringifier.stringify (dart:convert/json.dart:886:5)
E/flutter (16289): #6      JsonEncoder.convert (dart:convert/json.dart:287:30)
E/flutter (16289): #7      JsonCodec.encode (dart:convert/json.dart:186:45)
E/flutter (16289): #8      DefaultTransformer.transformRequest (package:dio/src/TransFormer.dart:72:21)
E/flutter (16289): <asynchronous suspension>
E/flutter (16289): #9      Dio._transformData (package:dio/src/Dio.dart:473:32)
E/flutter (16289): <asynchronous suspension>
E/flutter (16289): #10     Dio._makeRequest (package:dio/src/Dio.dart:375:28)
E/flutter (16289): <asynchronous suspension>
E/flutter (16289): #11     Dio._request.<anonymous closure>.<anonymous closure> (package:dio/src/Dio.dart:308:20)
E/flutter (16289): #12     _RootZone.runUnary (dart:async/zone.dart:1381:54)
E/flutter (16289): #13     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
E/flutter (16289): #14     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:633:45)
E/flutter (16289): #15     Future._propagateToListeners (dart:async/future_impl.dart:662:32)
E/flutter (16289): #16     Future._completeWithValue (dart:async/future_impl.dart:477:5)
E/flutter (16289): #17     Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:507:7)
E/flutter (16289): #18     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (16289): #19     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter (16289): 
E/flutter (16289): #0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
E/flutter (16289): #1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (16289): #2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

是调用的方式不对吗

Most helpful comment

put 方法是不支持携带formdata 的,因为目前很多后台框架都不支持,请求方法换成post 即可。

All 3 comments

我看了下文档,好像是上传文件只有post,put不可以吗

put 方法是不支持携带formdata 的,因为目前很多后台框架都不支持,请求方法换成post 即可。

@wendux 十分感谢你的答复。

Was this page helpful?
0 / 5 - 0 ratings