Loading

QT 获取下载文件大小

1 开发环境

  • linux 版本:统信 UOS 1030(可以认为是特殊的 ubuntu)

  • 开发语言:C++

  • QT:5.9.9 或 5.14.2 均可

2 实现代码

头文件

#include <QtNetwork>

Qt.pro 中需要加对应一行

QT += network

函数代码:

int getFileInfoSize(QString url)
{
    qDebug() << "getFileInfoSize url:" << url.toStdString();

    qint64 size = -1;

    QNetworkAccessManager manager;
    // 事件循环,等待请求文件头信息结束;
    QEventLoop loop;
    // 超时,结束事件循环;
    QTimer timer;

    // 发出 Get 请求(这个地方看你的 url 需要 get 还是 post,自己改)
    QNetworkReply *reply = manager.get(QNetworkRequest(url));
    // 忽略 SSL 错误
    reply->ignoreSslErrors();
    if (!reply) {
        qDebug() << "replay error!";
        return -1;
    }
    
    // 有数据则退出 loop
    connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit()));
    // 请求完成则退出 loop
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    // 超时则退出 loop
    connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
    
    // 超时 5s
    timer.start(1000 * 5);
    loop.exec();

    if (!timer.isActive())
    {
       // 请求超时超时,未获取到文件信息;
       qDebug() <<  "Request Timeout";
       return -1;
    }
    timer.stop();

    QVariant var = reply->header(QNetworkRequest::ContentLengthHeader);
    size = var.toLongLong();
    if (size == 0) {
        if (reply->hasRawHeader(QString("Content-Length").toUtf8()))
        {
              QString fileSize = reply->rawHeader(QString("Content-Length").toUtf8());
              LOG(INFO) << "fileSize:" << fileSize.toStdString() << " bytes";

              size = fileSize.toLongLong();
        }
    }
    qDebug() << "size:" << size << " bytes";

    reply->deleteLater();

    return size;
}

3 注意事项

如果没有报错,size = 0,可能并未触发 readyRead 信号,需要考虑此处

QNetworkReply *reply = manager.get(QNetworkRequest(url));

可以用 postman 或抓包先进行确定

4 运行效果

传入 https://www.baidu.com,效果如下:

5 参考资料

1、Qt 之 HTTP 请求 多线程分块下载——上(获取下载文件大小)- 前行中的小猪 - https://blog.csdn.net/GoForwardToStep/article/details/53159360

2、QT之HTTP下载获取文件大小信息 - 苍月代表我 - https://www.cnblogs.com/lifan3a/articles/7691974.html

3、Qt 5.9.9 demo

4、Qt 5.4.12 demo

posted @ 2023-05-09 13:42  她爱喝水  阅读(88)  评论(0编辑  收藏  举报