06 мая 2011

Как скачать файл из интернета?

Загружать файлы с помощью C++ Builder очень просто, мы рассмотрим один из способов загрузки файлов из интернета. Все, что нам понадобиться, новый проект компонент IdHTTP (вкладка Indy Clients) и любой обработчик событий, например Button. Так же я покажу как отображать процесс загрузки файла, с помощью ProgressBar.


Создаем пустой проект, добавляем на форму компонент IdHTTP (вкладка Indy Clients), Button и в обработчик события OnClick пишем:
// Указываем URL адрес файла в интернете
UnicodeString URL_DOWNLOAD ="";

// Под каким названием сохраниться загруженный файл
UnicodeString FILE_NAME = ""; 

// Создаем указатель на поток для работы файлами
// Ключ fmCreate - означает, что будет создан новый (пустой) файл, если файл с указанным названием уже существует, он будет открыть в режиме чтения. А ключ fmOpenWrite - откроет файл для записи.
TFileStream* FILE_STREAM = new TFileStream(FILE_NAME, fmCreate | fmOpenWrite); 

// Отправляем запрос GET на указанный URL с файлом, если сервер нам вернет ответ
// Пустой файл будет занимать столько же места, сколько и загружаемый файл, но в процессе загрузки он будет постепенно дописываться
IdHTTP1->Get(URL_DOWNLOAD, FILE_STREAM);

// После завершения загрузки, освобождаем память
delete FILE_STREAM;
Теперь можно попробовать загрузить файл из интернета, укажем в
URL_DOWNLOAD = " http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.0.1/en_US/AdbeRdr1001_en_US.exe";
FILE_NAME = "AdbeRdr1001_en_US.exe";
 Так же можно создать функцию для автоматического определения названия файла ...

 Запускаем программу, нажимаем на кнопку, если все заработало, программа повиснет. И будет висеть до завершения загрузки. Но есть способ обойти зависание и в этом нам поможет компонент IdAntiFreeze (вкладка Indy Misc), добавляем компонент на форму и тестируем нашу программу. Если все заработало, отобразим процесс загрузки. Добавим компонент ProgressBar (вкладка Win32). Теперь создадим два обработчика событий для компонента IdHTTP, первый - OnWorkBegin
void __fastcall TForm1::IdHTTP1WorkBegin(TObject *ASender, TWorkMode AWorkMode,__int64 AWorkCountMax){
    ProgressBar1->Max = AWorkCountMax;
}
во второй обработчик - OnWork
void __fastcall TForm1::IdHTTP1Work(TObject *ASender, TWorkMode AWorkMode,__int64 AWorkCount){
    ProgressBar1->Position = AWorkCount;
}
Как видим, все просто!

8 комментариев:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Переименуйте статью в "Как подвесить вомпьютер".

    ОтветитьУдалить
  3. там виснуть вроде не из за чего

    ОтветитьУдалить
  4. Повисать оно будет на время закачки. Чтобы этого не происходило, нужно закачку файла (особенно если тяжелый) выбрасывать в отдельный поток (курите TThread или WinAPI).
    А так спасибо автору за небольшую и полезную заметку.

    ОтветитьУдалить
  5. [C++ Error] Unit1.cpp(22): E2451 Undefined symbol 'UnicodeString' такую бадягу выводит и что хочеш то и делай. в нете рался ничего не нашел полезного

    ОтветитьУдалить
  6. Raiced exseption class EFCreated error - вылазит ошибка при выполнении

    IdHTTP1->Get(URL_DOWNLOAD, FILE_STREAM);

    ОтветитьУдалить
  7. А имя файла как узнать? автоматически

    ОтветитьУдалить

Темы