Flutter Dio: не удалось загрузить изображение на сервер

#flutter #file-upload #dio

#флаттер #загрузка файла #dio

Вопрос:

Прежде всего, я сначала пытаюсь запустить Postman, и это работает.

введите описание изображения здесь
введите описание изображения здесь

После этого я создал свою функцию dio для загрузки на сервер следующим образом.

 Future<AttendanceResponse> checkOut(
    String timeOfCheckout,
    File image,
    String notes,
  ) async {
    try {
      String fileName = image.path.split('/').last;
      print("Image name --> $fileName");
      print("Image path --> ${image.path}");
      final formData = FormData.fromMap({
        "out": timeOfCheckout,
        "out_picture": await MultipartFile.fromFile(
          image.path,
          filename: fileName,
        ),
        "out_note": notes,
        "late": 0,
      });
      final response = await dio.post("attendances/check-out", data: formData);
      return AttendanceResponse.fromJson(response.data);
    } on DioError catch (e) {
      return e.error;
    }
  }
  

Но появляется ошибка, подобная приведенной ниже.

 Dio Response Error --> DioError [DioErrorType.RESPONSE]: Http status error [302]
  

И это файл и путь от камеры.

 I/flutter ( 2163): Image name --> scaled_32592bd5-704d-4e0a-9976-9ea94c667f7d4583818212866102164.jpg
I/flutter ( 2163): Image path --> /storage/emulated/0/Android/data/id.cometdev.bozzetto.dev/files/Pictures/scaled_32592bd5-704d-4e0a-9976-9ea94c667f7d4583818212866102164.jpg
  

Я уже гуглю и читаю документы от dio и следую им, но все еще сталкиваюсь с этой ошибкой.

Ответ №1:

Это моя ошибка, я забыл добавить token в свою функцию dio.

 Future<AttendanceResponse> checkOut(
    String timeOfCheckout,
    File image,
    String notes,
  ) async {
    try {
      var fileName = image.path.split('/').last;
      var token = await prefHelper.getToken();
      print("Token --> $token");

      var headers = {
        'content-type': 'application/json',
        'accept': 'application/json',
        'authorization': 'Bearer $token',
      };

      final formData = FormData.fromMap({
        "out": timeOfCheckout,
        "out_picture": await MultipartFile.fromFile(
          image.path,
          filename: fileName,
        ),
        "out_note": notes,
        "late": 0,
      });
      final response = await dio.post("attendances/check-out",
          data: formData, options: Options(method: "POST", headers: headers));
      return AttendanceResponse.fromJson(response.data);
    } on DioError catch (e) {
      return e.error;
    }
  }
  

Ответ №2:

Вам необходимо добавить contentType свойство к данным вашей формы. Это будет выглядеть так,

   final formData = FormData.fromMap({
    "out": timeOfCheckout,
    "out_picture": await MultipartFile.fromFile(
        image.path, 
        filename: fileName,
        contentType: new MediaType("image", "jpeg"), // Here we add the content type!
     ),
    "out_note": notes,
    "late": 0,
  });
  

Комментарии:

1. Я пытаюсь добавить, но все еще не работаю и все еще получаю ту же ошибку