У меня проблема с отправкой файла изображения в виде ответа Http с флаттера http-сервера.Когда код ДЕЙСТВИТЕЛЬНО работает, изображение загружается на клиент под правильным именем, но повреждено и не может быть открыто.И часто клиент выдает исключение: Failed decoding image. Data is either invalid, or it is encoded using an unsupported format.
Это было протестировано с несколькими изображениями и на физических устройствах.
Использование этого кода в тандеме на двух устройствах Android в сети LAN, цельIP жестко запрограммирован для одного из устройств.(совет о том, как получить этот ip из трансляции или что-то еще будет оценено):
сервер:
Future _startWebServer() async {
runZoned(() {
String requestString;
HttpServer.bind(InternetAddress.anyIPv4, 8080).then((server) {
server.transform(HttpBodyHandler()).listen((HttpRequestBody body) async {
requestString = utf8.decode(body.body);
switch (requestString) {
case 'fileName':
{
body.request.response.write(basename(_imageFile.path));
body.request.response.close();
break;
}
case 'file':
{
body.request.response.write(_imageFile.readAsBytesSync());
body.request.response.close();
break;
}
default:
{
body.request.response.write('hello from server!');
body.request.response.close();
}
}
});
});
},
onError: (e, stackTrace) => print('Oh No! $e $stackTrace'));
}
клиент:
File _imageFile;
void _receiveData() async {
String fileName = "FILE1";
HttpClient client = new HttpClient();
await client.getUrl(Uri.parse("http://192.168.1.11:8080"))
.then((HttpClientRequest request) {
request.headers.contentLength = utf8.encode('fileName').length;
request.write('fileName');
return request.close();
})
.then((HttpClientResponse response) {
response.transform(utf8.decoder).listen((contents){
centerText = contents;
fileName = contents;
});
setState(() {});
});
Directory tempDir = await getExternalStorageDirectory();
var fileSave = new File(tempDir.path + '/' + fileName);
var _downloadedData = List<int>();
await client.getUrl(Uri.parse("http://192.168.1.11:8080"))
.then((HttpClientRequest request) {
request.headers.contentLength = utf8.encode('file').length;
request.write('file');
return request.close();
})
.then((HttpClientResponse response) async {
print('Received file');
//------------------Decode error here-----------------
response.listen((d) => _downloadedData.addAll(d),
onDone:(){
fileSave.writeAsBytes(_downloadedData);
});
setState(() {
_imageFile = fileSave;
});
});
client.close();
}
Любой совет, критикаи комментарии по проблеме или код в целом будет принята с благодарностью.Спасибо!