2013-10-16 61 views
0

我在閱讀在線文件時遇到了一些問題。我試圖在它被下載到一個臨時文件後讀取文件中的內容。這裏是我的代碼:Qt使用QNetworkReply獲取網絡請求,將數據下載到臨時文件

void MainWindow::fileIsReady(QNetworkReply * reply) 
{ 
    QTemporaryFile tmpFile; 
    tmpFile.write(reply->readAll()); 

    QByteArray asdf = reply->readAll(); 
    qDebug() (QString("%1").arg(asdf.length())); // returns 0 

    if (tmpFile.open()) 
    { 
     qDebug << "attempting to read file"; 

     QTextStream stream(&tmpFile); 
     QString value = stream.readAll(); 
     qDebug << value; // value is returning nothing 
    } 
    else 
    { 
     qDebug() << "failed to open internet file"; 
    } 
} 

// in MainWindow constructor (MainWindow::MainWindow)... 


QNetworkAccessManager * manager = new QNetworkAccessManager(this); 
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileIsReady(QNetworkReply*))); 
manager->get(QNetworkRequest(QUrl("https://www.website.com/stuff/file.exe.md5"))); 

我打算用它來比較兩個md5字符串。

回答

1

有在你的代碼的幾個問題:

  1. 你需要在寫入之前打開tmpFile
  2. reply->readAll()只會返回一次數據。其他調用將返回空數組。一旦你使用readAll收到數據,如果你以後需要它,你有責任將它存儲在一個變量中。
  3. 在寫入文件之後,文件指針位於其末尾。你無法從中讀取任何內容,因爲那裏沒有數據。您可以使用seek將指針移動到文件的開頭並閱讀其內容。
  4. 剛剛向數據寫入數據之後從文件中讀取數據沒有意義。您可以直接使用QTextStreamQNetworkReply從中讀取文本。 (也許這只是爲了調試,我不知道。)
  5. 很難相信你需要創建一個臨時文件來計算md5。有更簡單的方法來做到這一點。
+0

是的,我只是想通了。我會發布我的解決方案。 –

0

因此,事實證明我是愚蠢的,忘了先打開回復。另外,我沒有必要創建一個臨時文件。這是我的解決方案::

void MainWindow::fileIsReady(QNetworkReply * reply) 
{ 
    if (reply->error() == QNetworkReply::NoError) 
    { 
     if (reply->open(QIODevice::ReadOnly)) 
     { 
      QByteArray asdf = reply->readAll(); 

      qDebug() << (QString("asdf %1").arg(asdf.length())); 

      qDebug() << (QString(asdf)); 
     } 
     else 
     { 
      qDebug << "cant open reply"; 
     } 
    } 
}