gpt4 book ai didi

qt - 如何使用 Qt 从 SourceForge 下载文件

转载 作者:可可西里 更新时间:2023-11-01 17:11:18 28 4
gpt4 key购买 nike

我正在使用 Qt 框架编写 C++ 应用程序,需要从 SourceForge 下载文件。

我必须下载这个文件 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 协议(protocol) (QHttp::ConnectionModeHttp) 而不是 https。如果可以的话,我希望避免使用 https。可能是问题的根源?

非常感谢!

最佳答案

我在另一个论坛上得到了答案(感谢 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();
}

非常感谢那些试图帮助我的人!

关于qt - 如何使用 Qt 从 SourceForge 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213138/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com