2012-08-31 61 views
1

我正在編寫一個使用Qt框架的C++應用程序,需要從SourceForge下載文件。如何使用Qt從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 ::得到未阻止功能立即返回一個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

嘗試直接鏈接:http://ignum.dl.sourceforge.net/project/meshlab/updates/1.3.3/updates.xml –

+0

此外,QHttp已棄用,通常建議您不要使用它。 QNetworkAccessManager是替代品。 –

+0

我嘗試了你的建議。使用downloads.sourceforge.net/project/meshlab/updates/1.3.3/updates.xml我沒有收到「Invalid Project」錯誤。不幸的是,現在我得到一個完全空的文件。其他一些想法?非常感謝你的幫助! –

回答

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

非常感謝給誰試圖幫助我的人!

+0

也許這是新的,但是如果你沒有指定用戶代理,那麼sourceforge似乎拒絕發送數據:'''''''req.setRawHeader(「User-Agent」,「My App」);'' – PierreBdR