1

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/ダウンロードページ。この他のアドレスも試しましたが、何も変わりませんでした。

https の代わりに Http プロトコル (QHttp::ConnectionModeHttp) を使用していることに注意してください。できれば、https の使用は避けたいと思います。問題の原因になる可能性はありますか?

どうもありがとう!

4

1 に答える 1

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();
}

私を助けようとしてくれた人たちに感謝します!

于 2012-09-03T09:13:19.050 に答える