此问题在StackOverFlow和网络的其他地方可能也有类似的问题。但是我没有找到适合我的解决方案的成功。 我将提供尝试做的事情。 基本上,我试图使用API POST将图像上传到REST后端。在发布请求中,我需要从图库或照相机设置该图像“字段”。为此,我使用了image_picker库并使用path_provider软件包来获取路径。
当我尝试传递数据对象时,出现上述错误,无法弄清在哪里以及如何解决。这是我的第一个真实的扑扑项目,通过抓和失败我学到了很多东西。感谢您为解决该问题提供的任何帮助。
上传图片的服务电话
Future<dynamic> createThePet(data, apiUrl, File file, String fileName) async{
var fullUrl = _baseUrl + apiUrl; // + await _getToken();
//multipart request
var request = http.MultipartRequest('POST', Uri.parse(fullUrl),);
//
Map<String, String> headers = {
"Content-type" : "multipart/form-data" ,
};
//
request.files.add(http.MultipartFile(
'image',
file.readAsBytes().asStream(),
file.lengthSync(),
filename: fileName,
contentType: MediaType('image', 'jpeg'),
));
//
request.headers.addAll(headers);
request.fields.addAll(data);
//
print('request ' + request.toString());
var res = await request.send();
print('the response '+ res.toString());
// return res.statusCode;
// final response = await http.post(fullUrl, body: jsonEncode(data), headers: _setHeaders());// _setHeaders());
if(res.statusCode == 200){
var responseString = await res.stream.bytesToString(); // .body;
print(responseString);
var resp =json.decode(responseString);
print(resp.toString());
if(resp['success']){
print("success response------------ "+ responseString);
return petCreateFromJson(responseString);
}else{
print("failed response------------ "+ responseString);
return errorModelFromJson(responseString);
}
}else{
// throw Exception();
return null;
}
}
传递给服务调用的请求正文
PickedFile petImage = await picker.getImage(source: ImageSource.camera,maxHeight: 1000);
_imageURI = File(petImage.path);
fileName = _imageURI.path.split("/").last;
var dogData = Map<String, dynamic>.from({
'user_email': userEmail,
'user_token': userToken,
'pet': {
"age": petAgeController.text,
"birth_date": bdate,
'image': '', //this is the field I need to upload the image for...
'name': petNameController.text,
"sex": _petSex,
'weight': petWeightController.text,
'user_id': userID,
}
});
呼叫方法
final pet = await CallApi().createThePet(dogData, 'pets/create', _imageURI, fileName).timeout(const Duration(seconds: 30),onTimeout : () {
pr.hide();
setState(() {
_showAlert = true;
});
_showSnackbar('Connection Timed out, Please Try Again Later.', errorNet);
throw TimeoutException('The connection has timed out, Please try again!');
});
.....
如果我可以解决此问题,将对您有所帮助。我看。转发给它。我尝试了12个小时才想到这种结构,但仍然没有运气。请尽我所能。