由于打算想利用qt +opencv做图像识别的服务器,前端利用流行的微信小程序搭建。在搞微信小程序上传图片到qt并解析过程遇到不少问题,现在记录下,本人没有用qt的http接口和模块,因为只是通过操纵tcp协议获取到的数据进行解析。
如下面为小程序发上来的数据包:
"POST / HTTP/1.1
content-type: multipart/form-data; boundary=--------------------------521858318383516070054717
Referer: https://servicewechat.com/wxfca1ec4a7345fb1a/devtools/page-frame.html
host: 192.168.1.101:8060
content-length: 12392745
Connection: close
----------------------------521858318383516070054717
Content-Disposition: form-data; name="shopId"
----------------------------521858318383516070054717
Content-Disposition: form-data; name="uploadFile"; filename="wxfca1ec4a7345fb1a..7247cd00adcb1d7833276bc5dfc1929f.jpg"
Content-Type: image/jpeg
???à
参考过Http的post命令都说数据是从“boundary=”开始,其实也算是,不过那个数据是指微信小程序发过来的数据不包含报头信息,其中数据里面也有报文头,这里其实也不怎么关心,我们只需要知道文件数据包总大小和图片开始位置,这个可以直接利用函数size()算出来,不用关心数据里面,其次就是图片开启位置是“Content-Type: image/jpeg”的后面,网上也是这么说的,但是对照http文档这里要有两个回车换行才是真正的数据(图片),分析如下:
利用qt函数查找对应的字符的后面20字节显示,
bite.indexOf("image/jpeg",0);
输出十六进制:696d6167652f6a7065670d0a0d0affd8ffe00010
0d0a0d0a这个为两个回车换行紧接就是数据,数据开头就是ffd8ffe00010.......
所以依据这个规律就可以获取到图片数据
附上重要代码:
int start=bite.indexOf("image/jpeg",0)+14+ui->lineEdit->text().toInt();
int stop=bite.size()-start;
//图片显示
QPixmap pixmap;
pixmap.loadFromData(bite.mid(start,stop-1));
ui->label->setPixmap(pixmap);
// 缓存到本地
QFile file("D:/Qt5/Qt5_Code/build-Demo_Http_RevPIC-Desktop_Qt_5_7_0_MinGW_32bit-Debug/head1.jpg");
if (file.open(QIODevice::Append))
file.write(bite.mid(start,stop));
//删除数据包
bite.clear();
就是那么简单,有什么问题可以留言下面!