R
Rumata72324. Mai 2018 03:37

Скачивание больших файлов

Добрый день.


Подскажите пожалуйста, какими средствами можно скачивать большие файлы из интернета с помощью QT, например: архивы, ресурсные *.rcc файлы и т.п.
Можно ли для этого использовать облачные хранилища (например Dropbox), или же для этого нужен свой сервер и т.п.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

7
Evgenii Legotckoi
  • 24. Mai 2018 03:43

Добрый день.


В принципе, размер файла будет влиять только на длительность скачивания. А средства для скачивания все будут одни и теже.
Я бы рекомендовал использовать QNetworkAccessManager. Он без проблем может скачивать всё, что необходимо.

Почитать можно в следующих статьях:
    R
    • 24. Mai 2018 05:01

    Пытаюсь скачать картинку *.png, используя пример из урока 035.

    По следующей ссылке:
    QUrl url("https://drive.google.com/uc?export=download&confirm=no_antivirus&id=18JxR-2y8qtskhRD0MhKToSue9euMYZUh");
    Файл создаю тоже формата *.png:
    QFile *file = new QFile("D:/123.png");
    В дебаге получаю сообщение "Downloading is completed", но по итогу появляется файл размером 1кб.

    Что я делаю не так?
      R
      • 24. Mai 2018 10:06

      Банально даже *.exe файл не могу скачать таким способом. Текст по примеру - да, качается. А вот какие-либо файлы - нет.

      void Downloader::getData()
      {
          QUrl url("http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe"); // URL, к которому будем получать данные
          QNetworkRequest request;    // Отправляемый запрос
          request.setUrl(url);        // Устанавлвиваем URL в запрос
          manager->get(request);      // Выполняем запрос
      }
      
      void Downloader::onResult(QNetworkReply *reply)
      {
          // Если в процесе получения данных произошла ошибка
          if(reply->error()){
              // Сообщаем об этом и показываем информацию об ошибках
              qDebug() << "ERROR";
              qDebug() << reply->errorString();
          } else {
              // В противном случае создаём объект для работы с файлом
              QFile *file = new QFile("D:/123.exe");
              // Создаём файл или открываем его на перезапись ...
              if(file->open(QFile::WriteOnly)){
                  QByteArray content= reply->readAll();
                  file->write(content);  // ... и записываем всю информацию со страницы в файл
                  file->close();                  // закрываем файл
              qDebug() << "Downloading is completed";
              emit onReady(); // Посылаем сигнал о завершении получения файла
              }
          }
      }
        Evgenii Legotckoi
        • 24. Mai 2018 16:55

        Фу... Ну Вы и задачку подбросили...

        Проблема оказалась в том, что те URL, которые вы показали в качестве примера имеют редиректы. Это не прямые ссылки. Например в случае с инсталлятором Qt - это редирект с кодом 302.
        Я написал пробное приложение для скачивания (чуть позже статью выложу) и пытался с помощью него понять, что не так. Пока не заглянул в содержимое того, что скачивалось. Там прямым текстом было написано, что файл перемещён, а данный URL является редиректом.
        Чтобы справиться с этой проблемой нужно просто разрешить запросам следовать по редиректам.

        Попробуйте так сделать
        void Downloader::getData()
        {
            QUrl url("http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe"); // URL, к которому будем получать данные
            QNetworkRequest request;    // Отправляемый запрос
            request.setUrl(url);        // Устанавлвиваем URL в запрос
            request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
            manager->get(request);      // Выполняем запрос
        }
          R
          • 24. Mai 2018 20:59
          • (bearbeitet)

          Спасибо! Работает.


          Но появились новые проблемы:
          1) Данные висят в ОЗУ до закрытия программы. Если бы это был архив весом в 2гб+ - это было бы проблемой.
          2) Данные скачиваются огромным пакетом. Пока искал решение первичной проблемы, набрел на обсуждение использования функции readyRead(), которая позволяет записывать данные кусками сразу, не загружая при этом весь файл в ОЗУ, но так и не понял как с ней обращаться. Переопределять этот метод или как... Не пойму.
          3) Как можно прикрутить к этому ProgressBar, который показывал бы прогресс и скорость?
          4) Если делать функцию "отмены закачки", получается нужно определять QNetworkReply reply и QFile file ещё в конструкторе, и работать с ними в отдельном методе ?
          reply->abort();
          reply->deleteLater();
          file.close();
          file.remove();
          P.s. Где вообще следует использовать deleteLater()? В вашем примере его, например, нет.
            Evgenii Legotckoi
            • 25. Mai 2018 02:12
            • Die Antwort wurde als Lösung markiert.

            На первые три вопрос ответы есть вот в этой новой статье по QNetworkAccessManager и созданию Downloadera .

            Что касается последнего вопроса, то нужно вызывать deleteLater когда реквест отработал и reply уже не нужен. Но удалять его нужно именно через deleteLater.
              R
              • 25. Mai 2018 03:12

              Понял, большое спасибо.

                Kommentare

                Nur autorisierte Benutzer können Kommentare posten.
                Bitte Anmelden oder Registrieren
                Letzte Kommentare
                A
                ALO1ZE19. Oktober 2024 08:19
                Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь Максимов5. Oktober 2024 07:51
                Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas55. Juli 2024 11:02
                QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                k
                kmssr8. Februar 2024 18:43
                Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                Jetzt im Forum diskutieren
                J
                JacobFib17. Oktober 2024 03:27
                добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                JW
                Jhon Wick1. Oktober 2024 15:52
                Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                КГ
                Кирилл Гусарев27. September 2024 09:09
                Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                F
                Fynjy22. Juli 2024 04:15
                при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                Folgen Sie uns in sozialen Netzwerken