关闭

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

标签: qt数据图片
59人阅读 评论(0) 收藏 举报
分类:

看了看电脑右上角的时间,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 map
        filesMap[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.

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

qt启动图片加载,多窗口实现

  • 2013-10-30 09:18
  • 14.42MB
  • 下载

qt保存图片

在桌面使用grabWindow()截屏有两种方式: 1.grabWindow()处理后使用,也就是给它个window句柄继续使用。当然今天我们这里不讲它。我们讲下一种方法。 2.qml下grabToI...
  • dcba2014
  • dcba2014
  • 2016-12-07 17:16
  • 277

Qt通过UDP传图片,实现自定义分包和组包

一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPack...
  • caoshangpa
  • caoshangpa
  • 2016-09-27 16:35
  • 3124

QT中通过HTTP URL获取并保存网页上的图片

通过HTTP来获得网页上的图片,在MFC中主要是通过类CInternetSession类完成,在QT中则是通过三个类来完成,QNetworkAccessManager,QNetworkRequest,...
  • Enter_
  • Enter_
  • 2016-04-08 20:14
  • 3909

QT实现,通过URL下载文件的接口实现

QT通过URL下载类封装
  • u011915578
  • u011915578
  • 2015-06-22 13:35
  • 2323

QT一张图片包含对应多个状态图片

  • 2015-12-30 16:34
  • 21KB
  • 下载

Android下载多个图片(传统Http请求方式)

今天要做一个图片下载方式,图片不算多,图片最多有5个左右。我想了好几个办法, 1、文件下载:可行,但是对于单一的图片下载来说,略复杂了些。 2、第三方图片下载:可行,但是需要去了解和学习第三方,所...
  • qq_21451721
  • qq_21451721
  • 2016-03-22 15:56
  • 2202

qt程序实现多个图片连续显示效果像动画一样

qt学习也快一个月了,最近想做一个有趣的程序。效果是这样的:通过定时器连续显示几幅图片,串联起来看像是动的一样,我在网上找了几幅关于小鸡破壳而出那个有趣的场景,然后通过程序实现效果就是小鸡破壳而出。 ...
  • luckywang1103
  • luckywang1103
  • 2012-12-14 14:00
  • 10302

利用zend framework的Zend_File_Transfer_Adapter_Http类实现多个图片的上传

1、首先,我们在页面上添加file控件,点击add按钮之后就可以多增加一个file。     <div style="float:l
  • A82168506
  • A82168506
  • 2011-04-23 19:03
  • 4102

qt5 上传图片到http服务器

转载请注明出处:http://www.cnblogs.com/dachen408/p/8185060.html   qt5 上传图片到http服务器,亲测可以用,qt5.8+vs2015,直接上码...
  • neochan1108
  • neochan1108
  • 2018-01-03 18:13
  • 19
    个人资料
    • 访问:327278次
    • 积分:8806
    • 等级:
    • 排名:第2521名
    • 原创:574篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论