使用 QNetworkAccessManager 从 Web 检索数据:文件已下载但 QNetworkReply::readAll 返回 null

Posted

技术标签:

【中文标题】使用 QNetworkAccessManager 从 Web 检索数据:文件已下载但 QNetworkReply::readAll 返回 null【英文标题】:Retrieving data from web with QNetworkAccessManager: the file is downloaded but QNetworkReply::readAll returns null 【发布时间】:2013-11-15 12:23:01 【问题描述】:

已经有同样的问题,但单一的答案没有帮助:Qt Download File - QNetworkAccessManager, not getting data

所以,我正在尝试下载一个文件:

QNetworkRequest request;
request.setUrl(QUrl(fileUrl));
QNetworkReply * reply = m_nam.get(request);
connect(reply, SIGNAL(finished()), this, SLOT(onDownloadRequestFinished()), Qt::UniqueConnection);
connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(onDownloadRequestProgress(qint64, qint64)), Qt::UniqueConnection);

onDownloadRequestFinished 插槽中:

QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
if (reply && reply->error() == QNetworkReply::NoError) 
   Q_ASSERT(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200);
   qDebug() << "reply " << reply->bytesAvailable() << reply->pos() << reply->size() << reply->isReadable() << reply->openMode() << reply->isOpen();

插槽打印以下内容:reply 0 0 0 true OpenMode( "ReadOnly" ) true 所以,没有数据。但是,我可以清楚地看到它确实在某处下载了一些东西。从onDownloadRequestProgress来看,这是一个大文件,它确实会下载它。

重要说明:几乎相同的代码在同一台计算机上的另一个项目中工作。我正在尝试找出差异,但目前还没有发现。

数据在哪里?

【问题讨论】:

请检查reply-&gt;attribute(QNetworkRequest::HttpStatusCodeAttribute)值。 @PavelStrakhov:我也有Q_ASSERT(reply-&gt;attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200);,它永远不会触发。更新代码以包含它。 你看到通过网络嗅探器接收到的数据了吗? @peppe:我手边没有嗅探器,但我 100% 确定文件正在被下载。 【参考方案1】:

您是否连接了 readyRead() 信号以将接收到的字节写入特定文件?

我总是这样做来保存文件:

 const QNetworkRequest& request = QNetworkRequest(url);
 reply = qnetworkaccessmanager->get(request);
 QObject::connect(reply, SIGNAL(readyRead()), this,
        SLOT( readingReadyBytes() ));

然后我创建我的插槽:

 void yourClass::readingReadyBytes() 
    file->write(reply->read(reply->bytesAvailable()));
 

【讨论】:

我会尝试,但不认为会有任何不同。我在问题中指定的基本代码是正确的,因为它适用于另一个项目。 有点我没用QNetworkAccessManager之类的东西开发,所以记不太清楚了,但是没有readyRead()怎么能保存物理数据呢? 我的问题中演示了另一种方式 - finished() 信号和 reply-&gt;readAll()

以上是关于使用 QNetworkAccessManager 从 Web 检索数据:文件已下载但 QNetworkReply::readAll 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

离线使用 QNetworkAccessManager

跨 dll 使用 QNetworkAccessManager

使用 QNetWorkAccessManager 将值传递给插槽

如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP

如何使用 QNetworkAccessManager 找出数据传输延迟

使用 QNetworkAccessManager 时如何处理代理