#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 .