J'utilise un service Web pour le traitement d'images, cela fonctionne bien dans Postman:
Maintenant, je veux faire une requête http en flutter avec Dart:
import 'package:http/http.Dart' as http;
static ocr(File image) async {
var url = '${API_URL}ocr';
var bytes = image.readAsBytesSync();
var response = await http.post(
url,
headers:{ "Content-Type":"multipart/form-data" } ,
body: { "lang":"fas" , "image":bytes},
encoding: Encoding.getByName("utf-8")
);
return response.body;
}
mais je ne sais pas comment télécharger le fichier image, dans le code ci-dessus, une exception se produit: Bad state: Cannot set the body fields of a Request with content-type "multipart/form-data".
Comment dois-je écrire le corps de la demande?
Votre solution de contournement devrait fonctionner; beaucoup de serveurs accepteront application/x-www-form-urlencoded comme alternative (bien que les données soient codées de manière moyennement inefficace).
Cependant, il est possible d'utiliser Dart: http pour le faire. Au lieu d'utiliser http.post
, vous voudrez utiliser un objet http.MultipartFile
.
Dans la documentation Dart :
var request = new http.MultipartRequest("POST", url);
request.fields['user'] = '[email protected]';
request.files.add(http.MultipartFile.fromPath(
'package',
'build/package.tar.gz',
contentType: new MediaType('application', 'x-tar'),
));
request.send().then((response) {
if (response.statusCode == 200) print("Uploaded!");
});
Je voudrais vous recommander dio package, dio est un puissant client HTTP pour Dart/Flutter, qui prend en charge les intercepteurs, les données de formulaire, les annulations de demandes, les téléchargements de fichiers, les délais, etc.
dio est très facile à utiliser, dans ce cas, vous pouvez:
Envoi de FormData:
FormData formData = new FormData.from({
"name": "wendux",
"file1": new UploadFileInfo(new File("./upload.jpg"), "upload1.jpg")
});
response = await dio.post("/info", data: formData)
Plus de détails s'il vous plaît se référer à dio 。
Ceci peut être réalisé en utilisant la classe MultipartRequest ( https://docs.flutter.io/flutter/package-http_http/MultipartRequest-class.html )
Modifiez le type de support et l'URI selon vos besoins.
uploadFile() async {
var postUri = Uri.parse("<pathToFile>");
var request = new http.MultipartRequest("POST", postUri);
request.fields['user'] = 'blah';
request.files.add(new http.MultipartFile.fromBytes('file', await File.fromUri("<path/to/file").readAsBytes(), contentType: new MediaType('image', 'jpeg')))
request.send().then((response) {
if (response.statusCode == 200) print("Uploaded!");
});
}