2

アプリケーションにURL(通常はEXEまたはJar)からファイルをダウンロードさせようとしていますが、これは大きく変わるはずではありません。私はこれをすべてスレッドで実行していますが、それが違いを生むとは思いません(それが私に知らせた場合)。

つまり、Do_Downloadは、マネージャーを作成し、URLとリクエストを設定し、getを実行する私の関数です。次に、終了した信号をスロットに接続して、ファイルを書き込みます。

void DownloadManager::Do_Download() {
    QNetworkAccessManager *netManager = new QNetworkAccessManager(this);
    QUrl url(install_mirror); //istall_mirror is the URL provided by user
    QNetworkRequest req(url);

    QNetworkReply *reply = netManager->get(req);

    connect(reply, SIGNAL(finished()), this, SLOT(writeData()));
}

私のwriteData関数はエラーをチェックし、エラーがない場合はデータをファイルに書き込みます。

void DownloadManager::writeData() {
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());

    if (reply) {
        if (reply->error() == QNetworkReply::NoError) {
            QFile file(location);
            if(file.open(QIODevice::WriteOnly)) {
                    file.write(reply->readAll());
            } else {
                errorMessage = "Error writing downloaded file for mirror installation";
            }
        } else {
            //get http status code
            int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
            errorMessage = "HTTP Error code while downloading from mirror: " + httpStatus;
        }

        reply->deleteLater();
    } else {
        errorMessage = "Error downloading file from installation mirror";
    }
}

書き込まれているデータがないという問題があります。0Kbファイルを作成するだけです。データの受信で何が起こっているのかを確認できるように、ダウンロードの進行状況スロットを追加してみました。そこで、これをDo_Downloadメソッドに追加しました。

connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(DL_Progress(qint64,qint64)));

void DownloadManager::DL_Progress(qint64 recieved, qint64 total) {
    std::cout << recieved << " / " << total << endl;
}

出力は0/01として1回表示されます

私は何が間違っているのですか?

4

1 に答える 1