2013-02-26 2 views
2

Я пытаюсь загрузить приложение из URL-адреса, обычно EXE или Jar, но это не должно сильно меняться. У меня есть все, что работает в потоке, но я не думаю, что это изменит ситуацию (если это даст мне знать).Qt Загрузить файл - QNetworkAccessManager, не получая данные

So 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

Что я делаю неправильно?

+0

У Вас есть объект QCoreApplication и цикл событий выполняющийся? –

ответ

1

Единственная проблема, которую я вижу в вашем коде, - это то, что вы не дожидаетесь завершения загрузки. Объект NetworkRequest будет разрушен в конце вызова функции.

Итак, я хотел бы переписать Do_Download как это (QEventLoop запрос позволит синхронизировать сети):

void DownloadManager::Do_Download() { 
    QEventLoop eventLoop; 
    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()), &eventLoop, SLOT(quit())); 
    eventLoop.exec(); 

    writeData(reply); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^