当前位置: 首页 > 知识库问答 >
问题:

如何使用Qt从SourceForge下载文件

亢琦
2023-03-14

我正在使用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.html" target="_blank">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::设置主机和 QHttp::获取都不会阻止函数立即返回一个整数 ID。当 http 文件传输完成后,将自动调用解析应答函数。问题是,在更新.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::Coneck tionModeHttp)而不是https。如果可以的话,我希望避免使用https。可能是问题的根源吗?

非常感谢!

共有1个答案

闾丘卓
2023-03-14

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

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

 类似资料:
  • 问题内容: 在我的应用程序中,在客户端创建了一个json对象。该对象被发布到HttpServlet,后者基于POST数据创建pdf文件。 该文件将发送回用户。调用成功函数,并记录流数据。但是,我想要下载该文件。 如何实现呢? 我的客户端代码: }); 然后servlet创建文件: 日志中的输出: 我的解决方案:* 有关指针,请参见http://www.particletree.com/notebo

  • 问题内容: 我需要将文件从服务器下载到桌面。(UBUNTU 10.04)我没有Web访问服务器,只是ssh。 如果有帮助,我的操作系统是Mac OS X和iTerm 2作为终端。 问题答案: 在您的终端中,键入: 相应地替换用户名,主机,远程文件名和本地目录。 如果要访问EC2(或其他需要使用私钥进行身份验证的服务),请使用以下选项:

  • 问题内容: 我正在开发一个应用程序,为用户提供一个界面,用户可以在其中从我们的Google Cloud Storage下载文件。我编写了单元测试,可以连接到存储并下载了一个文件。 现在,我(几乎)完成了界面,我想测试整个应用程序。但是现在我注意到我并没有真正下载文件,而是下载了包含有关要下载文件的META数据的文件。就像是: 我想知道我在做什么错,这是我用来下载文件的代码: 问题答案: 如您所说,

  • 我在S3存储桶中有一个包含json文件的文件夹。我正在使用Spring Boot。用户提供和特定文件()名称。

  • 实际上我需要下载XLS文件从测试资源使用资源ID在java 谁能帮帮我吗 我尝试了下面的代码,但我遗漏了一些东西 上面的代码在 请帮忙 提前谢谢