【问题标题】:DioErrorType.response: Http status error [415] when Sending FormData via Dio FlutterDioErrorType.response:通过 Dio Flutter 发送 FormData 时的 Http 状态错误 [415]
【发布时间】:2023-02-23 00:00:48
【问题描述】:

我正在尝试将带有文件的 dio 表单数据发送到 api,但出现此错误。

Dio dio = Dio(
        BaseOptions(
          baseUrl: baseUrl,
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ${APIVariables.token}',
          },
        ),
      );

FormData formData = FormData.fromMap({
      "id": complaint.id,
      "title": complaint.title,
      "description": complaint.description,
      "complainedPosition": complaint.complainedPosition,
      "deptId": complaint.departmentId,
      "typeId": complaint.typeId,
      "priortyId": complaint.priorityId,
      "files": complaint.files
          .map((file) async => await MultipartFile.fromFile(file.path,
              filename: basename(file.path)))
          .toList(),
    });

Response response = await dio.post(
        'Complaint',
        data: formData,
        
      ),

如何以正确的方式发送带有选项的文件并显示具有上传百分比的进度,并在完成后得到响应?

【问题讨论】:

  • 状态代码 415 表示服务器端不接受您发送的文件格式,即“application/json”。你能检查一下服务器期望的正确格式是什么吗?
  • 这种类型来自 api:媒体类型 application/json Controls Accept 标头。

标签: flutter api file post dio


【解决方案1】:

首先导入http解析器:

import 'package:http_parser/http_parser.dart';

您还需要为您的文件添加内容类型,如下所示:

  "files": complaint.files
      .map((file) async => await MultipartFile.fromFile(file.path,
          filename: basename(file.path),contentType: MediaType('image', 'jpeg')))

我不知道你的文件类型是什么,如果你的文件媒体类型不同,请更改MediaType('image', 'jpeg')

【讨论】:

  • 我的媒体类型是 jpg、jpeg、png 和 pdf 我该怎么写?
  • 您需要从文件路径获取文件扩展名。使用这个: contentType: file.path.split('.').last.toLowerCase()=='pdf'?MediaType('application', 'pdf'):MediaType('image', '*')
  • 我试过了,但它仍然是同样的错误:(
  • 您确定您的后端服务器支持所有这些类型吗? '应用程序/pdf' '图像/jpg' '图像/jpeg' '图像/png' ?
【解决方案2】:

你的问题可能和我的一样。在我的例子中,我必须在创建 FormData 对象时指定 contentType。我使用 pub.dev 的 mime 包来为我查找媒体类型,这样它就不会失败。

 import 'package:mime/mime.dart';

    FormData data = FormData.fromMap({
      "file": await MultipartFile.fromFile(file.path,
          filename: fileName,
          contentType: MediaType.parse("${lookupMimeType(fileName)}")),
    });

    final response = await dio.post(
      "api/uploadFile",
      data: data,
      options: Options(headers: {"Content-Type": "multipart/form-data"}),
    );

更多详情,请访问我的问题here

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2022-12-23
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2022-11-29
    • 2020-03-22
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多