【问题标题】:Problem sending file over http connection using flutter使用颤振通过http连接发送文件的问题
【发布时间】:2019-11-05 20:24:50
【问题描述】:

我在将图像文件作为来自 Flutter http 服务器的 Http 响应发送时遇到问题。当代码看似有效时,图像会以正确的名称下载到客户端,但已损坏且无法打开。而且很多时候,客户端会抛出异常:Failed decoding image. Data is either invalid, or it is encoded using an unsupported format. 这已经在多个图像和物理设备上进行了测试。

在 LAN 网络上的两台 android 设备上串联使用此代码,目标 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();
}

对于问题或一般代码的任何建议、批评和 cmets 将不胜感激。谢谢!

【问题讨论】:

  • 尝试在 HEX 编辑器中打开图像并寻找与原始图像相比的差异。也许您正在向它写入一些其他数据?
  • 感谢您的建议!我会试一试。

标签: android http flutter dart server


【解决方案1】:

没有意识到body.request.response.write()_imageFile.readAsBytesSync() as List&lt;int&gt; 转换为字符串。通过将body.request.response.write(_imageFile.readAsBytesSync()); 更改为body.request.response.add(_imageFile.readAsBytesSync()); 来修复

.add 将List&lt;int&gt;“添加”到响应正文中。

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 2020-03-09
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多