Проблема при отправке файла через http соединение с использованием флаттера - PullRequest
0 голосов
/ 24 июня 2019

У меня проблема с отправкой файла изображения в виде ответа 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();
}

Любой совет, критикаи комментарии по проблеме или код в целом будет принята с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 25 июня 2019

Не понял, body.request.response.write() преобразовал _imageFile.readAsBytesSync() as List<int> в строку. Исправлено путем изменения body.request.response.write(_imageFile.readAsBytesSync()); на body.request.response.add(_imageFile.readAsBytesSync());

.add "добавляет" List<int> в тело ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...