Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > как скачать файл?


Автор: Conclat 12.4.2004, 00:15
Сталкнулся с такой проблеммой:
Необходимо в определенное время скачать файл по ссылке в интернете и сохранить его на жестком диске в определенной директории. Желательно, чтобы это всё происходило без участия человека. Соединение с интернетом - постоянное.
Нужен пример на Delphi.

Автор: dm9 12.4.2004, 01:20
В общем, ты, как это обычно бывает, забил на ФАК. Я уж даже говорить об этом не хочу...

Статья из ФАКА:

Цитата
Как скачать любой URL используя стандартные настройки сети?
Previous  Top  Next 

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

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

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

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', [Url]);
        end;

      InternetCloseHandle(NetHandle);
    end
  else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
    raise Exception.Create('Unable to initialize Wininet');
end;

Взято с Исходников.ru http://www.sources.ru


По её мотивам - процедурка, скачивающая файл. Назначение параметров очевидно.
Подключать модуль WinInet

Код
procedure DownloadFile (const url: string; const savefile : String);
var
  NetHandle : HINTERNET;
  UrlHandle : HINTERNET;
  Buffer    : packed array [0..1023] of byte;
  BytesRead : Cardinal;
  f         : file;
begin
  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
     begin
        AssignFile (f, savefile);
        ReWrite (f, 1);
        InternetReadFile (UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
        while BytesRead <> 0 do
        begin
           BlockWrite (f, Buffer, BytesRead);
           InternetReadFile (UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
        end;
        InternetCloseHandle(UrlHandle);
        CloseFile (f);
     end
     else
     begin
        raise Exception.CreateFmt ('Cannot open URL %s', [Url]);
     end;
     InternetCloseHandle(NetHandle);
  end
  else
     raise Exception.Create ('Unable to initialize Wininet');
end;

Добавлено @ 01:21
Можешь сам туда индикатор прикрутить. Как это сделать - очевидно.
Добавлено @ 01:22
PS Можно тоже в ФАК засунуть...

Автор: Alex 12.4.2004, 07:34
Все это конечно хорошо говорить, но когда в интернет имеешь доступ через прокси, да к тому же он не поддерживает анонимного входа, то все ваши примеры можно смело отправлять в утиль.

Автор: Гость_Леонид 6.7.2004, 07:59
>alex-co ты че барзеешь брат, тебе дали реальный пример, если ты немого покопаешь в уазанную сторону, то найдешь и работу чрезе прокси и авторизацию все что хоешь

Автор: Alex 6.7.2004, 08:05
Цитата
>alex-co ты че барзеешь брат, тебе дали реальный пример, если ты немого покопаешь в уазанную сторону, то найдешь и работу чрезе прокси и авторизацию все что хоешь

И можно увидеть пример ваших копаний? mad.gif
Да и не забудьте проверить свой пример на ISA.

Автор: Alex 6.7.2004, 08:22
А лучше прочитайте http://forum.sources.ru/index.php?showtopic=40760&hl=internetopen&st=0 и все поймете

Автор: RA 7.7.2004, 17:00
Как скачать фаил:

Код

function DownloadFile(const FileURL, FileName: String): Cardinal;
var
 hSession, hFile: HInternet;
 Buffer: array[1..1024] of Byte;
 BufferLen, fSize: LongWord;
 f: File;
begin
 Result := 0;
 hSession := InternetOpen('Download',
                          INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if Assigned(hSession) then begin
   hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0,
                            INTERNET_FLAG_RELOAD, 0);
   if Assigned(hFile) then begin
     AssignFile(f, FileName);
     Rewrite(f,1);
     fSize := 0;
     repeat
       InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);
       BlockWrite(f, Buffer, BufferLen);
       fSize := fSize + BufferLen;
     until (BufferLen = 0);
     CloseFile(f);
     Result := fSize;
     InternetCloseHandle(hFile);
   end;
   InternetCloseHandle(hSession);
 end;
end;


А если через прокси, то прошу обратить внимание на функцию
"InternetOpen"

Код
function InternetOpen(lpszAgent: PChar;
                     dwAccessType: DWORD;
                     lpszProxy, lpszProxyBypass: PChar;
                     dwFlags: DWORD): HINTERNET; stdcall;

Добавлено @ 17:01
Цитата(alex @ 6.7.2004, 08:22)
А лучше прочитайте http://forum.sources.ru/index.php?showtopic=40760&hl=internetopen&st=0 и все поймете

Сылка не работает (Уменя)

Автор: Alex 7.7.2004, 17:08
ссылка работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)