Qt5 - 从Url下载文件时获取内容的长度

问题描述:

我使用Get方法从Url下载“.apk”文件。 该文件已成功从服务器上下载到我的磁盘上。 我实际上想要将一个进度条添加到我的程序中。问题是:我可以显示bytesReceived,但无法显示我正在下载的文件(ContentLenth)的总字节数。我怎样才能从服务器取得它。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代码正常工作。感谢您的时间@Kuba Ober – Chakib

我解决了这一问题。其实这不是QT问题。这个Qt代码正常工作。 问题来自未在应答标题上发送ContentLenth的服务器。