Я хочу отправить файл jpg из моего приложения флаттера в серверную часть .Net. Я использую пакет http.
Мой код выглядит следующим образом:
var uri = Uri.parse('$url/upload/$id');
var request = http.MultipartRequest('POST', uri);
var headers = {'accept': '*/*', 'Content-Type': 'multipart/form-data'};
request.headers.addAll(headers);
var x = await file.readAsBytes();
var mFile = http.MultipartFile.fromBytes('file', x);
request.files.add(mFile);
var response = await request.send();
Вот file файл XFile из пакета cross_file.
К сожалению, я получаю код ошибки - 400 "Неверный запрос".
На стороне бэкенда код выглядит следующим образом
[HttpPost("/upload/{id}")]
public IActionResult UploadImage(IFormFile imageFormFile, [FromRoute] Guid id)
{
// program does not even enter the function
}
Я проверил это с помощью Swagger, и он работает, он генерирует следующий завиток:
curl -X 'POST' \
'http://localhost:44383/apiname/f7765448-be93-4e72-b62e-04623b4ccdb1' \
-H 'accept: */*' \
-H 'Content-Type: multipart/form-data' \
-F '[email protected];type=image/jpeg'
Я искал некоторые форумы и учебники, но ничего не работает.
Я пытался добавить файл с помощью fromBytes, fromPath и fromString, ничего не получилось.
Я пробовал экспериментировать с различными комбинациями заголовков и полей, это тоже не сработало. В частности, я пытался добавить поля «imageFormFile» и «type», как в Swagger curl, но это тоже не сработало.
Я также пытался переписать это, используя dio, но получил тот же результат (также я бы предпочел придерживаться http, так как остальная часть моего проекта использует его).





Future uploadRequest(String url, String filePath) async {
final dio = Dio();
dio.options.contentType = "multipart/form-data";
final multiPartFile = await MultipartFile.fromFile(
filePath,
filename: filePath.split('/').last,
);
FormData formData = FormData.fromMap({
"file": multiPartFile,
});
final response = await dio.post(
url,
data: formData,
);
return response.data;
}
Это 100% рабочее решение, но с пакетом dio, так как я предпочитаю его http. Но это не значит, что с http нельзя.
ВАЖНО: formData может отличаться в зависимости от вашего API.
Спасибо, это сработало после небольшой настройки - при создании FormData его имя должно совпадать с именем аргумента в бэкэнд-функции - поэтому в этом случае «файл» пришлось изменить на «imageFormFile».