使用QNetworkAcessManager

时间:2015-06-05 18:25:37

标签: qt http file-transfer qnetworkaccessmanager

我正在开发一个客户端应用程序,其目的是从Web服务器下载一些文件,暂时将它们存储在Temp文件夹中,检查文件完整性,然后将它们发送到嵌入式Linux设备中的FTP服务器。

最近,当我尝试从本地计算机进行下载时,我在初步开发阶段执行该过程时出现问题(请参阅相关问题here)。现在我可以从我的机器下载和上传没有错误和验证(我使用QCryptographicHash +文件大小来检查任何不符合),但是当我尝试从HTTP服务器下载时也不会发生这种情况。

共下载了8个文件:3个.tar.gz,一个简单文本,两个程序和两个二进制文件。我能够成功下载所有压缩文件,文本文件和其中一个二进制文件,但其他程序,即两个程序和一个二进制文件(一个Linux内核映像)总是被错误下载。

我通过注意不仅哈希为它们返回错误而且还注意它们的大小来检查这一点:它们的大小总是错误的(并且对于任何下载尝试总是相同的错误值)。并且服务器中的文件都是正确的。

我的第一个怀疑是我需要以不同于本地机器的常见FTP下载的方式配置HTTP下载,但我不知道它会是怎样的。此外,如果需要这种额外的配置,那么为什么有些文件总能正确返回?

以下是相关代码:

void MainWindow::processNextDownload()
{
    QUrl ulrTemp(updateData.at(transferStep).downloadUrl.arg(ui->leID->text()));    //"//" +

    if (updateData.at(transferStep).downloadUrl.contains("http"))
        ulrTemp.setScheme("http");
    else
        ulrTemp.setScheme("file");

//    ulrTemp.setUserName();
//    ulrTemp.setPassword();
//    ulrTemp.setPort();

    qDebug() << "Downloading" << transferStep << "from" << ulrTemp;

#if 1
    poReply = downloadNetworkManager->get(QNetworkRequest(ulrTemp));
#else
    QNetworkRequest request;
    request.setUrl(ulrTemp);
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17");

    poReply = downloadNetworkManager->get(request);
#endif

    connect(poReply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(slotDownloadProgress(qint64,qint64)));

    ui->statusBar->showMessage(tr("Downloading: %1").arg(updateData.at(transferStep).itemName));
}


void MainWindow::slotFileDownloaded(QNetworkReply* reply)
{
    if (reply && (reply->error() != QNetworkReply::NoError))
    {
        ui->statusBar->clearMessage();

        if (!isSingleFile)
        {
            const QString strTemp = tr("An error occurred while downloading \"%1\": %2 (error message: %3)")
                                    .arg(updateData.at(transferStep).downloadName).arg(reply->error()).arg(reply->errorString());

            QMessageBox::critical(this,tr("Error in download"),strTemp);
        }
        else
        {
            //irrelevant...
        }

        finished(false);

        return;
    }

    qDebug() << "To write: " << reply->bytesAvailable();

    QByteArray downloadedData = reply->readAll();

    reply->deleteLater();
    poReply->deleteLater();

    //![]
    static const QString tempFilePath = QDir::tempPath();

    if (!isSingleFile)
    {
        QFile file(tempFilePath + "/" + updateData.at(transferStep).downloadName);


        if (!file.open(QFile::WriteOnly | QFile::Truncate))
        {
            qDebug() << "Failure opening temp file to write: " << file.fileName();

            QMessageBox::critical(this,
                                  tr("Error"),
                                  tr("An error occured while trying to open a temporary file to write the downloaded data (file: %1).").arg(file.fileName()));

            transferStep = downloadStepCount;

            slotFileUploaded(NULL);

            return;
        }

        qint32 bytesWritten = file.write(downloadedData);
        file.flush();

        if (downloadedData.size() != bytesWritten)
            qDebug() << "Write failed, wrote" << bytesWritten << "out of" << downloadedData.size() << "bytes.";
        else
            qDebug() << "Wrote " << bytesWritten << "bytes.";


        file.close();

        //![]
        if (++transferStep >= downloadStepCount)
        {
            qDebug() << "Start hash check";
            slotStartHashCheck();

            return;
        }

        processNextDownload();
    }
    else
    {
        //irrelevant...
    }
}

这就是我得到的原因(哈希码中“=”之后的最后一个数字值是文件大小):

Error message

那么我错过了什么?

0 个答案:

没有答案