#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. Я пытаюсь добавить, но все еще не работаю и все еще получаю ту же ошибку