2016-07-07 9 views
1

「Get」メソッドを使用してURLから「.apk」ファイルをダウンロードしています。 ファイルはサーバからディスクに正常に読み込まれません。 私は実際に自分のプログラムにプログレスバーを追加したいと思っています。問題は:bytesReceivedを表示できますが、私がダウンロードしているファイル(ContentLenth)のtotalBytesを表示できません。サーバーからどうすればいいですか?ここでQt5 - URLからファイルをダウンロード中にコンテンツの長さを取得する

は、ダウンロードしながら、私は私のqDebugに得るものです:

3498 of -1 
    799062 of -1 
    1923737 of -1 
    3037550 of -1 
    3200231 of 3200231 

はここに私のコードです:

void DownloadApk::LaunchDownload() 
{ 
    QNetworkProxy proxy; 
    proxy.setType(QNetworkProxy::HttpProxy); 
    proxy.setHostName("proxy"); 
    proxy.setPort(8080); 
    QNetworkProxy::setApplicationProxy(proxy); 


    QUrl url("I put my Url here"); 
    QNetworkRequest request(url); 


    _file = new QFile("C:/Users/Desktop/testdownload/downloadedFile.apk"); 
    _file->open(QIODevice::WriteOnly); 


    QNetworkAccessManager *_manager= new QNetworkAccessManager; 
    _reply = _manager->get(request);// Manager is my QNetworkAccessManager 
    _file->write(_reply->readAll()); 
    connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), 
      this, SLOT(error(QNetworkReply::NetworkError))); 
    connect(_reply, SIGNAL(downloadProgress(qint64, qint64)), 
      this, SLOT(updateProgress(qint64, qint64))); 
    connect(_reply, SIGNAL(finished()), 
      this, SLOT(finished())); 
} 


void DownloadApk::error(QNetworkReply::NetworkError err) 
{qDebug() << err; 
    // Manage error here. 
    _reply->deleteLater(); 
} 
void DownloadApk::updateProgress(qint64 read, qint64 total) 
{ 
    qDebug() << read <<"of"<<total ; 
    QByteArray b = _reply->readAll(); 
    QDataStream out(_file); 
    out << b; 
} 

void DownloadApk::finished() 
{ 
    QMessageBox::information(this, tr("Complete"), tr("Successfully Downloaded")); 
    // Done 
    _reply->deleteLater(); 
    _file->close(); 
    // probably delete the file object too 
} 
+0

サーバーでコンテンツの長さを指定できますか?それをバックアップするwiresharkのトレースがありますか? –

+0

あなたは正しいです!私はcontentLengthがhttpヘッダーで自動的に送られたと教えました。私は明らかに間違っていた。 APIを修正しました。このQtコードは正しく動作します。あなたの時間をありがとう@クバオーバー – Chakib

答えて

0

が、私は問題を修正しました。実際にはQTの問題ではありませんでした。このQtコードは正しく動作します。 問題は、応答のヘッダーにContentLenthを送信していないサーバーからのものでした。

関連する問題