cfug / dio

A powerful HTTP client for Dart and Flutter, which supports global settings, Interceptors, FormData, aborting and canceling a request, files uploading and downloading, requests timeout, custom adapters, etc.
https://dio.pub
MIT License
12.47k stars 1.51k forks source link

图片上传,Postman请求成功,但是dio上传失败~ #570

Closed cuixiaodong closed 4 years ago

cuixiaodong commented 4 years ago

dio: 3.0.4 Dart: 2.5.0 Flutter: 1.9.1+hotfix.6

上传文件代码: static Future upLoadFile(String method, String uri, String filePath, ResponceSuccess responceSuccess, ResponceError responceError, {Map<String, dynamic> body}) async { // 头部 Map<String, dynamic> heads = { "Content-Type": "multipart/form-data", "platform-type": "SHOP_KEEPER" }; // token if (!StringUtils.isEmpty(Api.getInstance().token)) { heads['token'] = Api.getInstance().token; } Options op = Options(method: method, headers: heads);

String name =
    filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length);

FormData formData = FormData.fromMap(
    {"file": await MultipartFile.fromFile(filePath, filename: name)});

return _dio
    .request<Map<String, dynamic>>(uri,
        queryParameters: body ?? Map<String, dynamic>(),
        data: formData,
        options: op)
    .then((resp) {
  doResponse(resp, responceSuccess, responceError);
});

}

上传一直失败,dio还尝试3.0.0还有3.0.5版本,一样失败~

ShshyDevooo commented 4 years ago

我也遇到同样的情况一直 [DioErrorType.RESPONSE]: Http status error [404]报这个错误

ShshyDevooo commented 4 years ago

后台报错是MissingServletRequestParameterException,说是没有"file"参数。

wendux commented 4 years ago
  1. 用v3.0.6
  2. method是什么?
  3. 抓一下请求包,截图贴出来
ShshyDevooo commented 4 years ago
  1. 用v3.0.6
  2. method是什么?
  3. 抓一下请求包,截图贴出来

3.0.6现在下载不下来,会报错 Because flutter_module depends on dio ^3.0.6 which doesn't match any versions, version solving failed. pub get failed (1)

ShshyDevooo commented 4 years ago

TIM图片20191122141837 TIM图片20191122141842 这是我昨天抓的包 method 是post。 当我发起请求的时候通过dio.options.method能取得到是post,但是[DioErrorType.RESPONSE]: Http status error [404]报这个错误,通过dio.options.method取到的是null。

Slihao commented 4 years ago

3.0.6可以了

cuixiaodong commented 4 years ago

3.0.6可以了

还是不行!

cuixiaodong commented 4 years ago

3.0.6可以了

还是不行!

3.0.6可以了,但是问题还在~

naijab commented 4 years ago

3.0.6可以了

还是不行!

3.0.6可以了,但是问题还在~

me too. but I got 422 error

wendux commented 4 years ago

@cuixiaodong @naijab 刚merge了一个FormData的MR,可以先升级到3.0.7试试是否OK. 如果问题依然存在请对比postman的请求头看看和dio的请求头,看看差异在什么地方。我这没法帮你调试。

cuixiaodong commented 4 years ago

@cuixiaodong @naijab 刚merge了一个FormData的MR,可以先升级到3.0.7试试是否OK. 如果问题依然存在请对比postman的请求头看看和dio的请求头,看看差异在什么地方。我这没法帮你调试。

Postman请求: 1574686375889 1574686405978

Dio请求: 1574686338156 1574686304055 服务端返回数据:{"code":"500","msg":"后台异常","data":""}

wendux commented 4 years ago

@cuixiaodong 是3.0.7吗?如果是的话,需要抓一下dio的请求包,来对比postman和dio的请求包。还有,服务端报500的话也可以看一下服务端日志,看看什么问题导致了服务端错误

cuixiaodong commented 4 years ago

@cuixiaodong 是3.0.7吗?如果是的话,需要抓一下dio的请求包,来对比postman和dio的请求包。还有,服务端报500的话也可以看一下服务端日志,看看什么问题导致了服务端错误

TIM图片20191126164331 TIM图片20191126164450

用的是3.0.7,其实请求方式、params、请求头都没问题,唯一不太一样的就是异常情况下,也就是图二,红色区域少了一个文件的Content-Length。MultipartFile之前也有打印,也有数据的。

wendux commented 4 years ago

看不出问题啊,500是服务端异常了,看看服务端日志吧。要么就提供一下服务端的代码,我本地跑一下,要不然我也追查不了了....

cuixiaodong commented 4 years ago

看不出问题啊,500是服务端异常了,看看服务端日志吧。要么就提供一下服务端的代码,我本地跑一下,要不然我也追查不了了....

好,这边先跟服务端排查下。

luohs commented 4 years ago

看不出问题啊,500是服务端异常了,看看服务端日志吧。要么就提供一下服务端的代码,我本地跑一下,要不然我也追查不了了....

好,这边先跟服务端排查下。

你好,问题解决了吗?我们报“未选择文件上传”,服务端小伙伴说没有收到图片的二进制流。postman是可以正常上传的,传的自定义参数都是一样的,但是不知道postman和dio默认参数哪里存在差异。我用的是dio 3.0.7 版本

cuixiaodong commented 4 years ago

看不出问题啊,500是服务端异常了,看看服务端日志吧。要么就提供一下服务端的代码,我本地跑一下,要不然我也追查不了了....

好,这边先跟服务端排查下。

你好,问题解决了吗?我们报“未选择文件上传”,服务端小伙伴说没有收到图片的二进制流。postman是可以正常上传的,传的自定义参数都是一样的,但是不知道postman和dio默认参数哪里存在差异。我用的是dio 3.0.7 版本

还没,这边这段在搞其它项目,服务端那边还没排查,不过我用抓包工具抓的图片有上传的二进制信息。但是情况是一样的,postman可以上传成功,这个上传失败,所以问题应该是一样的,服务端没识别或者正常读取到上传的文件,

MeDeity commented 4 years ago

之前用的是2.x的版本上传成功,我现在采用的版本是3.0.7. FormData requestParams = FormData.fromMap({ "image_file": MultipartFile.fromFile(imageFile.path,filename:PortraitUtils.getFileName(imageFile)), }); 接口调用时,会告诉我image_file文件没有上传

image

shaoting0730 commented 4 years ago

我的也是500报错. 其他图片可以,就几张不行. 但是小程序都可以.后台完全没有收到这条请求.而上传其他图片又是可以.... image

stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If this is still an issue, please make sure it is up to date and if so, add a comment that this is still an issue to keep it open. Thank you for your contributions.

shaoting0730 commented 4 years ago

我这边弄好了,上传之前需要对图片先压缩一下,不敢多大都压缩下就好,不压缩的话,有时2-3M都可以成功,几百k的却失败,这个时候压缩一下就好了.压缩我是用 https://github.com/OpenFlutter/flutter_image_compress

cuixiaodong commented 4 years ago

我这边后期让服务端配合修改了,现在上传没问题了。

shingsoso commented 4 years ago

我这边后期让服务端配合修改了,现在上传没问题了。

請問一下服务端是做了什麼修改?

Hu-Wentao commented 4 years ago

我这边后期让服务端配合修改了,现在上传没问题了。

請問一下服务端是做了什麼修改?

我让后端把文件格式校验的代码去掉了, 然后就成功了

ixugo commented 4 years ago

同失败 , 在后台就没拿到数据

然后去掉 http2 后就没问题了....

应用重启后, http2 的网络都连不上了, 我遇到的问题在 http2 上

AcYangle commented 3 years ago

我也遇到了同样的问题,我使用for循环上传多张图片,循环次数<=2时都能成功,>2时只会成功2次,其余的全报500 有遇到同样问题的吗 for (var item in resultList) { HttpManager().uploadAsync( url: Api.uploadImage(), tag: 'uploadimage' + item.path, options: Api.getHeader(), data: FormData.fromMap({ // "file": await MultipartFile.fromFile(widget.file.path, // filename: "file.jpg"), 'file': MultipartFile.fromBytes( File(item.path).readAsBytesSync(), filename: item.path.split("/").last, ), }), onSendProgress: (count, total) { print(count.toString() + '-----' + total.toString()); // setState(() { // isUpLoading = true; // progress = (count / total).toDouble(); // }); }, jsonParse: (code, data) { // widget.uploadFinishCall(data); // print(widget.file); // setState(() { // progress = 1.0; // isUpLoading = true; // }); }, errorCallback: (code, data) { CustomToast.showToast(msg: data); }, ); }

Hu-Wentao commented 3 years ago

可能与文件头的media type有关, 多与后端沟通一下