Ошибка ошибки [DioErrorType.RESPONSE]: ошибка состояния Http [404]

#flutter #http #file-upload #multipartform-data #dio

#трепетание #http #загрузка файла #составная форма-данные #dio

Вопрос:

Форма почтальона-запрос данных

Тело запроса, содержащее

Ожидаемый орган реагирования

Код флаттера Dio

 import 'package:dio/dio.dart';
import 'package:flutter_project/config/config.dart';
import '../model/postImage.dart';
import 'dart:io';



Future<PostImage> postImage(File image) async{
  String fileName = image.path.split('/').last;
  print(fileName);

  try{
    Dio dio = new Dio();
    FormData formData = FormData.fromMap({
      "file": await MultipartFile.fromFile(image.path,filename: fileName)
    });
    Map<String, String> headers= <String,String>{
      'Content-Type':'multipart/form-data'
    };
    print("${baseURL}files/upload");
    Response response = await dio.post("${baseURL}files/upload",data: formData);
    if(response.statusCode == 200){
      print("Uploaded");
    }
    else{
      print(response.data);
    }
    
  }
  catch(e){
      print(e);
  }

}
 

Ожидание, которое я получаю: ошибка [DioErrorType.RESPONSE]: ошибка состояния Http [404]

Ответ №1:

Я добавил ContentType: new MediaType(«изображение», «jpeg») //в FormData. Теперь это работает.

Полный код :

 import 'package:dio/dio.dart';
import 'package:flutter_project/config/config.dart';
import '../model/postImage.dart';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';

Future<PostImage> postImage(File image) async {
  String fileName = image.path.split('/').last;
  print(fileName);

  try {
    Dio dio = new Dio();
    FormData formData = FormData.fromMap({
      "file": await MultipartFile.fromFile(
        image.path,
        filename: fileName,
        contentType: new MediaType("image", "jpeg"),
      )
    });
    Map<String, String> headers = <String, String>{
      'Content-Type': 'multipart/form-data'
    };
    print("${baseURL}files/upload");
    Response response =
        await dio.post("${baseURL}files/upload", data: formData);
    if (response.statusCode == 200) {
      print("Uploaded");
    } else {
      print(response.data);
    }
    print('Out');
  } catch (e) {
    print(e);
  }
}

 

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

1. Если вы используете MediaType(), вам необходимо добавить импорт библиотеки вверху. import 'package:http_parser/http_parser.dart';

2. все еще не работает

Ответ №2:

Когда я столкнулся с ошибкой HTTP 4xx при использовании Dio, и я был уверен, что у меня установлена моя авторизация, что я сделал, чтобы заставить ее работать, — это явно установить параметр Options() . Точно, я установил тип метода (для запроса get) и токен авторизации следующим образом: Dio().get(url, options: Options(method: "GET", headers: { "Authorization": "Bearer ${LocalStorage().getString(Keys.token)}", }))); . Вы также можете установить тип содержимого, если это необходимо. Чтобы упростить задачу, вы можете просто скопировать и вставить в аргумент headers: некоторые значения заголовка, установленные в / вашим postman, когда вы делаете тот же запрос с помощью postman .