Qt 之QNetworkAccessManager 下载断点续传


前言

qt的QNetworkAccessManager get在下载文件时,当网络环境不确定行比较大时,比如网络断开等,往往需要程序实现断点续传的功能,好在qt帮我们做好了。下面看实现方法


如何实现?

用代码来回答。核心代码如下

#include
#include
#include
#include
#include
#include

class mDownload : public QObject {
  Q_OBJECT
 public:

  mDownload (QObject *parent = nullptr);
  ~mDownload ();

  Q_INVOKABLE void startDownload(const QString &url,
                                 const QString &saveFilePath, bool bOverWrite);
 signals:
  void progressChanged(qreal progress);
  void started();
  void finished();
  void update(int kiloBytesReceived, int kiloBytesTotal);
  void error(int errorCode, QString errorString);

 private slots:
  void onReadyRead();
  void onError(QNetworkReply::NetworkError ercode);
  void onFinished();
  void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);

 private:
  QNetworkAccessManager *_netManager;
  QNetworkReply *_networkReply;
 
  bool _bOverWrite;						//下载模式是否是直接覆盖
  qint64 _fileBeginSize;				//记录开始下载的位置
};

void mDownload ::innerStartDownload() {
  if (_running) {
    if (_networkReply) {
      if (_networkReply->isRunning()) _networkReply->abort();
      shutdownNetworkReply();
      shutdownSaveFile();
    }
  }

  _fileBeginSize = 0;

  if (_bOverWrite) {
    _file = new QFile(_tmpDestination);
    _file->open(QIODevice::WriteOnly);
  } else {
    _file = new QFile(_tmpDestination);
    _fileBeginSize = _file->size();
    _file->open(QIODevice::WriteOnly | QIODevice::Append);
  }

  QNetworkRequest request;
  QSslConfiguration config = QSslConfiguration::defaultConfiguration();
  config.setProtocol(QSsl::TlsV1_2);
  config.setPeerVerifyMode(QSslSocket::VerifyNone);
  request.setSslConfiguration(config);

  request.setUrl(QUrl(_url));

  QString strRange = QString("bytes=%1-").arg(_fileBeginSize);
  request.setRawHeader("Range", strRange.toUtf8());

  _networkReply = _netManager->get(request);

  connectToNetworkReplySignals();

  _lastReceiveDataTime = QDateTime::currentMSecsSinceEpoch();
  _checkNetWorkTimer->start();
  _progress = 0;
  _tryDownloadTimes++;
  setProgress(0.0);
  _running = true;
}

核心代码如上,主要是下面两行来实现断点续传功能:

 request.setUrl(QUrl(_url));
  QString strRange = QString("bytes=%1-").arg(_fileBeginSize);
  request.setRawHeader("Range", strRange.toUtf8());
  _networkReply = _netManager->get(request);

总结

方便吧。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QNetworkAccessManagerQt网络模块提供的类,用于网络资源的请求和响应。但是QNetworkAccessManager本身并不支持断点续传,需要开发者自行实现。 实现断点续传的一种常见方法是使用HTTP协议的Range头字段,该字段用于指定请求的字节范围。具体的实现步骤如下: 1. 首先,开发者需要在请求时添加Range头字段,以指定请求的起始位置。可以通过设置QNetworkRequest对象的setRawHeader方法来设置Range字段。 2. 当接收到响应时,可以通过QNetworkReply的rawHeader方法获取到响应头信息,如果响应头中包含Accept-Ranges字段,则表示该资源支持断点续传。 3. 如果资源支持断点续传,那么可以通过QNetworkReply的bytesAvailable方法获取到已下载的字节数,然后再次发起请求时,设置Range字段的起始位置为已下载的字节数,即可实现断点续传。 4. 在每次接收到数据时,开发者需要将已接收的数据追加到之前已下载的数据之后,以确保所有数据完整。 需要注意的是,实现断点续传对于服务器端和客户端都要支持,只有当服务器端支持Range头字段,且资源能够被分割成多个部分时,才能实现断点续传。 总结起来,通过在请求中设置Range头字段,结合服务器端的支持,可以实现QNetworkAccessManager断点续传功能。开发者可以根据具体的需求和场景,自行实现相应的断点续传逻辑。 ### 回答2: QNetworkAccessManager在网络编程中是一个重要的类,通过它我们可以方便地进行网络请求和数据交互。而断点续传是一种网络传输的机制,在文件下载中特别常见。 断点续传是指在进行文件下载时,如果下载过程中突然中断了,可以通过断点续传的机制,在中断处继续下载,而不是重新开始。这样可以节省时间和流量,提高下载效率。 在QNetworkAccessManager中实现断点续传的方法如下: 1. 首先,通过发送HTTP请求从服务器获取文件的大小和上次下载的位置。 2. 然后,使用QFile类创建一个本地文件,并移动到上次下载的位置。 3. 接下来,设置HTTP请求的Range头部,指定从上次下载的位置开始下载。 4. 在网络请求完成后,将接收到的数据写入本地文件。 5. 最后,更新文件的下载进度,并在下载完成后关闭文件。 通过以上步骤,我们可以实现断点续传的功能。如果在下载过程中突然中断,下次再次下载时,只需要获取上次中断的位置并设置Range头部,就可以继续下载未完成的部分,提高了下载的效率。 总之,QNetworkAccessManager是一个强大的网络编程工具,通过合理地使用它的功能,我们可以轻松实现文件的断点续传。 ### 回答3: QNetworkAccessManagerQt提供的网络访问类,它可以用于实现网络文件的下载和上传等功能。而断点续传指的是当文件传输中断后,能够从中断的位置继续传输,而不需要重新下载或上传整个文件。 QNetworkAccessManager本身并没有提供直接的断点续传功能,但可以通过下面的步骤实现: 1.在每次开始下载或上传前,先检查目标文件是否已经存在,并记录已经下载或上传的文件大小。 2.通过设置"Range"请求头信息来指定下载或上传的起始位置,以及结束位置。 3.在接收到服务器响应时,判断是否返回了"206 Partial Content"状态码,表示支持断点续传。如果返回了该状态码,就可以从响应的Content-Range头部获取已经下载或上传的字节数,并将其加上之前记录的字节数,即可计算出从哪个位置开始继续传输。 4.根据上述计算,设置新的"Range"请求头信息,继续发送请求。 5.接着继续下载或上传数据,直到完成。 通过上述逻辑,我们可以实现在网络传输中断后,能够从断点处继续传输的功能。同时,我们还可以根据具体需求,加入一些错误处理和进度条显示等功能,以提升用户体验。 总之,利用QNetworkAccessManager的网络请求、响应和数据读取等功能,结合HTTP协议中的"Range"请求头信息,我们可以实现断点续传的功能,提高网络传输的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值