日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT HTTP接收多个数据包生成图片

發布時間:2024/1/8 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT HTTP接收多个数据包生成图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看了看電腦右上角的時間,2017就要徹底流逝了。再瞅了瞅本月的文章數,天啦,只有一篇,近一個月沒有時間學習,沒有時間寫文章,沒有時間休息,總之就是沒時間……好強烈的罪惡感,趕緊抓住最后的幾個小時,補上一文!
我們知道簡單的HTTP請求可以一次返回結果,但對于一些數據量較大的情況,則要分多次返回。
QNetworkAccessManager下的QNetworkReply有readyRead信號,一旦該信號產生,就可以讀取相應的數據并寫入文件中。
對于較大的文件,比如圖片,一個http請求需要分多個數據包返回結果最后才能得到完整的集合。
好在有QNetworkReply::finished。該信號提示我們不會再有數據更新了,此時就可以關閉文件流,結束數據存儲。

如下:

request = new QNetworkRequest ();manager = new QNetworkAccessManager(this);request->setUrl(QUrl("https://static.baydn.com/static/img/icon_head.png"));reply = manager->get(*request);connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(slotError(QNetworkReply::NetworkError)));// SSL(Secure Sockets Layer 安全套接層), it encrypts data.connect(reply, SIGNAL(sslErrors(QList<QSslError>)),this, SLOT(slotSslErrors(QList<QSslError>)));connect(reply, SIGNAL(finished()), this, SLOT(slotFinished()));

數據存儲函數:

void HttpManager::slotReadyRead() {static int time = 0;QByteArray bytes = reply->readAll();QString url = reply->request().url().toString();int fd;if(searchFilesMap(url.toStdString())){ //if fd exist, we append data to local file.fd = filesMap[url.toStdString()];size_t ret = write(fd, bytes.toStdString().c_str(), bytes.size());if(ret <= 0){LOGDBG("write failed: %s", strerror(errno));}}else { //if not exist, we. open and write.string path = getIncomLocalPicPath(url.toStdString());fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC);if(fd == -1){LOGDBG("open failed, %s",strerror(errno));return ;}fchmod(fd, 0777);size_t ret = write(fd, bytes.toStdString().c_str(), bytes.size());if(ret <= 0){LOGDBG("write failed: %s", strerror(errno));}// add info to mapfilesMap[url.toStdString()] = fd;}LOGDBG("%d finished, fd: %d, url: %s",++time, fd, reply->request().url().toString().toStdString().c_str()); }

結束函數:
關閉句柄并重命名。

void HttpManager::slotFinished() {QString url = reply->request().url().toString();QByteArray bytes = reply->readAll();int fd = filesMap[url.toStdString()];close(fd);string f1;string f2;f1 = getIncomLocalPicPath(url.toStdString());f2 = getComLocalPicPath(url.toStdString());if(0 != rename(f1.c_str(),f2.c_str())){LOGDBG("rename failed: %s", strerror(errno));}LOGDBG("%d, finished.", fd); }

執行:

$ ./http_test [file: httpmanager.cpp, line: 152, funcName: slotReadyRead] 1 finished, fd: 19, url: https://static.baydn.com/static/img/icon_head.png [file: httpmanager.cpp, line: 152, funcName: slotReadyRead] 2 finished, fd: 19, url: https://static.baydn.com/static/img/icon_head.png [file: httpmanager.cpp, line: 152, funcName: slotReadyRead] 3 finished, fd: 19, url: https://static.baydn.com/static/img/icon_head.png [file: httpmanager.cpp, line: 152, funcName: slotReadyRead] 4 finished, fd: 19, url: https://static.baydn.com/static/img/icon_head.png [file: httpmanager.cpp, line: 152, funcName: slotReadyRead] 5 finished, fd: 19, url: https://static.baydn.com/static/img/icon_head.png [file: httpmanager.cpp, line: 181, funcName: slotFinished] 19, finished.

總結

以上是生活随笔為你收集整理的QT HTTP接收多个数据包生成图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。