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