R
Rumata72324 мая 2018 г. 13:37

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

Добрый день.


Подскажите пожалуйста, какими средствами можно скачивать большие файлы из интернета с помощью QT, например: архивы, ресурсные *.rcc файлы и т.п.
Можно ли для этого использовать облачные хранилища (например Dropbox), или же для этого нужен свой сервер и т.п.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

7
Evgenii Legotckoi
  • 24 мая 2018 г. 13:43

Добрый день.


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

Почитать можно в следующих статьях:
    R
    • 24 мая 2018 г. 15: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 мая 2018 г. 20: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
        • 25 мая 2018 г. 2: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
          • 25 мая 2018 г. 6:59
          • (ред.)

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


          Но появились новые проблемы:
          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 мая 2018 г. 12:12
            • Ответ был помечен как решение.

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

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

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

                Комментарии

                Только авторизованные пользователи могут публиковать комментарии.
                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                Ua

                Qt - Тест 001. Сигналы и слоты

                • Результат:84баллов,
                • Очки рейтинга4
                Ua

                Qt - Тест 001. Сигналы и слоты

                • Результат:42баллов,
                • Очки рейтинга-8
                ОК

                Qt - Тест 001. Сигналы и слоты

                • Результат:47баллов,
                • Очки рейтинга-6
                Последние комментарии
                ИМ
                Игорь Максимов22 ноября 2024 г. 21:51
                Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                Evgenii Legotckoi
                Evgenii Legotckoi31 октября 2024 г. 23:37
                Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                A
                ALO1ZE19 октября 2024 г. 17:19
                Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь Максимов5 октября 2024 г. 16:51
                Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas55 июля 2024 г. 20:02
                QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                Сейчас обсуждают на форуме
                f
                firstlunoxod15 февраля 2025 г. 13:46
                Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                Дмитрий
                Дмитрий3 февраля 2025 г. 16:24
                Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                NW
                Nayo Wai30 января 2025 г. 19:22
                не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                n
                nkly3 января 2025 г. 12:52
                Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                M
                Marsel17 августа 2023 г. 0:26
                OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                Следите за нами в социальных сетях