实际开发经常遇到下载网络文件的需求,对于一些比较大的网络文件,如果通过网络接口一次性读取数据后再写入文件,会占用较大的内存。比较好的做法是,先通过QNetworkRequest::ContentLengthHeader获取文件的大小,然后设定每次读取文件的数据大小,计算出需要读取的总次数,然后每读取一次数据,就写入文件。这样,可以大大降低文件下载过程中的内存占用。完整代码如下:
#include <QtNetwork>
#include <QFile>
#include <QFileInfo>
#include <QDebug>
class Downloader : public QObject {
Q_OBJECT
public:
Downloader(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void download(QString url, QString filename) {
QUrl u(url);
QNetworkAccessManager manager;
QNetworkRequest request(u);
QNetworkReply *reply = manager.head(request);
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
if(reply->error()) {
qDebug() << "Error: " << reply->errorStrin