Qt下载文件- QNetworkAccessManager,没有得到数据
Qt Download File - QNetworkAccessManager, not getting data
我试图让我的应用程序从URL下载文件,通常是EXE或Jar,而不是这应该改变太多。我有这一切都运行在一个线程,但我不认为会有什么不同(如果它让我知道)。
Do_Download是我的函数,它创建管理器,设置URL和请求,并执行get。然后尝试将完成的信号连接到将写入文件的插槽。void DownloadManager::Do_Download() {
QNetworkAccessManager *netManager = new QNetworkAccessManager(this);
QUrl url(install_mirror); //istall_mirror is the URL provided by user
QNetworkRequest req(url);
QNetworkReply *reply = netManager->get(req);
connect(reply, SIGNAL(finished()), this, SLOT(writeData()));
}
我的writeData函数检查错误,如果没有错误,它将数据写入文件。
void DownloadManager::writeData() {
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (reply) {
if (reply->error() == QNetworkReply::NoError) {
QFile file(location);
if(file.open(QIODevice::WriteOnly)) {
file.write(reply->readAll());
} else {
errorMessage = "Error writing downloaded file for mirror installation";
}
} else {
//get http status code
int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
errorMessage = "HTTP Error code while downloading from mirror: " + httpStatus;
}
reply->deleteLater();
} else {
errorMessage = "Error downloading file from installation mirror";
}
}
问题是没有数据写入。它只创建一个0Kb的文件。我试着添加一个下载进度槽,这样我就可以看到接收数据的情况。所以我把这个添加到Do_Download方法。
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(DL_Progress(qint64,qint64)));
void DownloadManager::DL_Progress(qint64 recieved, qint64 total) {
std::cout << recieved << " / " << total << endl;
}
输出一次显示为0/01
我做错了什么?
我在你的代码中看到的唯一问题是你没有等待下载完成。NetworkRequest对象将在函数调用结束时被销毁。
所以,我会重写Do_Download这样(QEventLoop同步网络请求):
void DownloadManager::Do_Download() {
QEventLoop eventLoop;
QNetworkAccessManager *netManager = new QNetworkAccessManager(this);
QUrl url(install_mirror); //istall_mirror is the URL provided by user
QNetworkRequest req(url);
QNetworkReply *reply = netManager->get(req);
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
writeData(reply);
}
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- 通过Wininet下载数据
- 如何使用MTP(设备不是相机)从USB设备上传和下载数据
- C++ 将文件下载到应用数据
- 为什么使用OpenCL下载数据比在GPU上上传要慢得多
- 使用 QNetworkAccessManager 从 web 检索数据:文件已下载,但 QNetworkReply::r
- 如何从任何链接下载数据
- 如何在qt程序中从维基百科下载数据
- 从维基百科页面下载数据
- 通过网络测量下载/上传数据
- 彭博的C++API下载日内即时报价数据的交换代码
- 如何通过数据包解析在FTP上传/下载中获得源和目的地的完整路径
- Qt下载文件- QNetworkAccessManager,没有得到数据
- libtorrent-rasterbar 无法使用磁力链接下载元数据