android - 使用颤振通过http连接发送文件的问题
问题描述
我在从颤动的 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();
}
对问题或一般代码的任何建议、批评和评论将不胜感激。谢谢!
解决方案
没有意识到body.request.response.write()
将其转换_imageFile.readAsBytesSync() as List<int>
为字符串。body.request.response.write(_imageFile.readAsBytesSync());
通过更改为修复body.request.response.add(_imageFile.readAsBytesSync());
.add “添加” aList<int>
到响应正文。
推荐阅读
- d3.js - D3v4:将文本添加到 d3.symbolCircle 的中心
- javascript - 如何使用电子表格中的值创建下拉菜单?
- ruby-on-rails - 下一个/上一个按钮发送到错误的路径?
- python - 使用python urlib2.open进行流式读取(逐块读取)只能得到部分结果
- algorithm - 计算递归关系的时间复杂度 f(n) = f(n/2) + f(n/3)
- mariadb - “总连接数”太多。是正常状态吗?MaxScale 2.3.9
- python - 如何在python中使用标准分割字符串数据?
- php - 如何在我的数据库中存储 $_SESSION 值
- opencv - OpenCV基于红色和绿色标记分离图像的背景和前景
- html - 我的字体很小,但我的突出显示大小很大?