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
}
サーバーでコンテンツの長さを指定できますか?それをバックアップするwiresharkのトレースがありますか? –
あなたは正しいです!私はcontentLengthがhttpヘッダーで自動的に送られたと教えました。私は明らかに間違っていた。 APIを修正しました。このQtコードは正しく動作します。あなたの時間をありがとう@クバオーバー – Chakib