我正在使用需要从SourceForge下载文件的Qt框架编写C ++应用程序。
我必须下载此文件https://sourceforge.net/projects/meshlab/files/updates/1.3.3/updates.xml
我使用Qt和QHttp类编写了以下代码:
QFile tmpfile;
int hostreqid;
int checkreqid;
...
...
tmpfile.setFileName("updates.xml");
hostreqid = http.setHost("sourceforge.net",QHttp::ConnectionModeHttp);
checkreqid = http.get(QString(QUrl::toPercentEncoding("/projects/meshlab/files/updates/1.3.3/updates.xml")),&tmpfile);
...
...
void parseAnswer( int id,bool error )
{
if (!error && (id == checkreqid))
{
...
tmpfile.close();
}
if (error)
{
QHttp::Error err = http.error();
QString errstrg = http.errorString();
}
}
QHttp :: setHost和QHttp :: get都不是阻塞函数,它们立即返回一个int id。当http文件传输完成后,会自动调用parseAnswer函数。 问题是在我获得的updates.xml文件中,而不是我期待的数据,我从SouceForge收到一个报告“无效项目”错误的html文件。
我注意到当我从浏览器访问https://sourceforge.net/projects/meshlab/files/updates/1.3.3/updates.xml时,我被重定向到https://sourceforge.net/projects/meshlab/files/updates/1.3.3/updates.xml/download页面。我也尝试了这个其他地址但没有改变。
请注意,我使用的是Http协议(QHttp :: ConnectionModeHttp)而不是https。如果可以,我希望避免使用https。可以是问题的根源吗?
非常感谢!
答案 0 :(得分:2)
我在另一个论坛得到答案(感谢AcerExtensa ......我不知道他的真名)。看起来问题是我错过了处理sourceforge重定向。 我在这里发布了他的回复:
#ifndef SFORGE_H
#define SFORGE_H
#include <QNetworkAccessManager>
#include <QNetworkReply>
class SForge : public QNetworkAccessManager
{
Q_OBJECT
public:
explicit SForge(QObject *parent = 0);
private slots:
void fin(QNetworkReply *);
};
#endif // SFORGE_H
code:
#include "sforge.h"
#include <QDateTime>
#include <QUrl>
#include <QNetworkRequest>
#include <QDebug>
SForge::SForge(QObject *parent):QNetworkAccessManager(parent)
{
QUrl url("http://downloads.sourceforge.net/project/meshlab/updates/1.3.3/updates.xml?r=&ts="+QString::number(QDateTime::currentDateTime().toTime_t())+"&use_mirror=heanet");
connect(this, SIGNAL(finished(QNetworkReply*)), this, SLOT(fin(QNetworkReply*)));
QNetworkRequest req(url);
this->get(req);
}
void SForge::fin(QNetworkReply * reply)
{
if(reply->error() != QNetworkReply::NoError)
qDebug() << reply->errorString();
if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 307 || reply->rawHeaderList().contains("Location"))
{
QNetworkRequest req(reply->header(QNetworkRequest::LocationHeader).toString());
this->get(req);
return;
}
qDebug() << __LINE__ << reply->bytesAvailable() << reply->readAll();
}
非常感谢那些试图帮助我的人!