Форум Кургана и Курганской области и наших друзей

Зима. Форум Кургана и Курганской области и наших друзей
17 Октябрь 2019, 12:19:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Получение файла из сети  (Прочитано 2553 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Xenon
Коллежский регистратор


Карма: 0
Offline Offline

Сообщений: 1


Награды
« : 18 Июль 2008, 05:26:02 »

Здравствуйте, возникла небольшая проблема. Необходимо решить задачу. А если быть более точным, то написать программу на Delphi и сдать ее исходник, суть которой в следующем. Программа открывает текстовый документ. В нем содержится ссылка на файл в интернете. Далее читает этот адрес. Загружает файл. Сохраняет его в указанную папку. Я думаю для знающих делфи людей, это совершенно пустяковая задача... Но вот проблема в том что делфи я совершенно не знаю.. а решение нужно скоро сдавать. Вот здесь нашел кое-какой материал. Но при попытке скомпилировать исходник в Делфи 6, вылазит куча ошибок. Например первая BufferLen: DWORD; - Dword неизвестный идентификатор и в то же духе.. В чем может быть проблема может быть у меня нет компонента Wininet? Тогда где его можно достать? Очень прошу мне помочь.. Только если можно все ясно и доступно... как я писал выше знания в делфи  равны нулю.. =(
Записан
sharpey
BSD'ун
Титулярный советник
*****

Карма: 126
Offline Offline

Пол: Мужской
Сообщений: 686



Награды
« Ответ #1 : 18 Июль 2008, 21:52:52 »

Поскольку в исходном задании не содержится сведений о типе сервера, с которого будут скачиваться файлы, наиболее рациональным и простым я вижу использование внешней программы - так называемого downloader'а, например, консольного и кросс-платформенного wget, обладающего массой положительных качеств по загрузке и надёжности. Например, я выкачивал с одного сервера образ DVD размером более 4 Гб с перерывами на игры сыном. После проверил контрольную сумму MD5 образа у себя на диске и на сервере. Излишне говорить, что они полностью совпали.
Алгоритм мне видится таким: на форме заполняется имя файла или вызывается меню выбора файла, затем запускается wget с параметрами (типа "wget --input-file=имя_файла_загрузки.txt") посредством функции ShellExecute Windows API, wget отрабатывает переданную ему команду с параметром. О ней можно почитать здесь, а wget для Windows можно взять здесь.
Писать код не буду, поскольку Delphi у меня нет. Да и задача уже упрощена до невозможности. Улыбка
Записан
evgentus
Титулярный советник
*****

Карма: 67
Offline Offline

Пол: Мужской
Сообщений: 762


Награды
« Ответ #2 : 29 Август 2008, 19:16:59 »

Начиная с Internet Explorer 3, Microsoft поддерживает очень полезные API, Wininet. Эти функции позволяют использовать все возможности IE, такие как настройки прокси, кэширование файлов и т.д.

 

Ниже приведён пример использования этих функций для скачивания файла с нужного URL. Это может быть любой доступный URL, ftp://, http://, gopher://, и т.д.

 

Более подробную информацию об этих функция можно посмотреть в MSDN - Win32 Internet API Functions.

Code:
 
function DownloadFile(const Url: string): string;

var

NetHandle: HINTERNET;

UrlHandle: HINTERNET;

Buffer: array[0..1024] of char;

BytesRead: cardinal;

begin

Result := '';

NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

 

if Assigned(NetHandle) then

   begin

 

     UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

 

     if Assigned(UrlHandle) then

{ UrlHandle правильный? Начинаем загрузку }

       begin

         FillChar(Buffer, SizeOf(Buffer), 0);

         repeat

           Result := Result + Buffer;

           FillChar(Buffer, SizeOf(Buffer), 0);

           InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);

         until BytesRead = 0;

         InternetCloseHandle(UrlHandle);

       end

     else

       begin

{ UrlHandle неправильный. Генерируем исключительную ситуацию. }

         raise Exception.CreateFmt('Cannot open URL %s', http://);       end;      InternetCloseHandle(NetHandle);   endelse{ NetHandle недопустимый. Генерируем исключительную ситуацию }   raise Exception.Create('Unable to initialize Wininet');end;   ©Drkb::03577Взято из [url]http://forum.sources.ru

Записан
evgentus
Титулярный советник
*****

Карма: 67
Offline Offline

Пол: Мужской
Сообщений: 762


Награды
« Ответ #3 : 29 Август 2008, 19:23:01 »

Перевод одноимённой статьи с сайта delphi.about.com )

 

Обычно при разработке приложений, которые планируется в дальнейшем обновлять и усовершенствовать, основные модули хранятся в виде пакетов (Package) или библиотек DLL. В настоящее время Internet предоставляет возможность без особых усилий осуществлять обновление этих модулей. Поэтому добавление к Вашему приложению функции авто-обновления, является наилучшим способом для обновления приложения.

 

Давайте посмотрим, как реализовывается данный механизм в любом FTP приложении.

 

Delphi предоставляет нам полный доступ к WinInet API (wininet.pas), который можно использовать для соединения и получения файлов с веб-сайта, который использует либо Hypertext Transfer Protocol (HTTP) либо File Transfer Protocol (FTP). Например, мы можем использовать функции из WinInet API для: добавления FTP браузера в любое приложение, создания приложения, которое автоматически скачивает файлы с общедоступных FTP серверов или поиска Internet сайтов, ссылающихся на графику и скачивать только графику.

 

Функция GetInetFile

Code:
 
uses Wininet;

 

function GetInetFile

(const fileURL, FileName: String): boolean;

const BufferSize = 1024;

var

hSession, hURL: HInternet;

Buffer: array[1..BufferSize] of Byte;

BufferLen: DWORD;

f: File;

sAppName: string;

begin

Result:=False;

sAppName := ExtractFileName(Application.ExeName);

hSession := InternetOpen(PChar(sAppName),

               INTERNET_OPEN_TYPE_PRECONFIG,

              nil, nil, 0);

try

hURL := InternetOpenURL(hSession,

           PChar(fileURL),

           nil,0,0,0);

try

  AssignFile(f, FileName);

  Rewrite(f,1);

  repeat

   InternetReadFile(hURL, @Buffer,

                    SizeOf(Buffer), BufferLen);

   BlockWrite(f, Buffer, BufferLen)

  until BufferLen = 0;

  CloseFile(f);

  Result:=True;

finally

  InternetCloseHandle(hURL)

end

finally

InternetCloseHandle(hSession)

end

end;
 

 

 

 

Обратите внимание: Чтобы обеспечить некоторую визуальную обратную связь для пользователя, Вы можете добавить строчку наподобие FlashWindow(Application.Handle,True) в тело блока "повторить/до тех пор" (repeat/until). Вызов FlashWindow API высвечивает заголовок Вашего имени приложений в панели задач.

 

Использование

Для вызова функции GetInetFile можно использовать следующий код:

Code:
 
var FileOnNet, LocalFileName: string

begin

FileOnNet:=

'http://delphi.about.com/library/forminbpl.zip';

LocalFileName:='File Downloaded From the Net.zip'

 

if GetInetFile(FileOnNet,LocalFileName)=True then

ShowMessage('Download successful')

else

ShowMessage('Error in file download')

end;
 

 

 

 

Данный код запрашивает файл 'forminbpl.zip' с сайта, скачивает его, и сохраняет его как 'File Downloaded From the Net.zip'.

 

Обратите внимание: В зависимости от версии Delphi, Вы можете использовать различные компоненты, которые можно найти на Интернет страницах, посвещённых VCL и, которые можно использовать для упрощения создания приложений (например FTP компонент, необходимый для TNMFTP, находящийся на странице FastNet VCL).

©Drkb::03295

Взято из http://forum.sources.ru

Записан
evgentus
Титулярный советник
*****

Карма: 67
Offline Offline

Пол: Мужской
Сообщений: 762


Награды
« Ответ #4 : 29 Август 2008, 19:24:33 »

Вдруг кому еще пригодится....))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC
rss | wap
Valid XHTML 1.0! Valid CSS!