Как загрузить папку файлов с веб-сервера с помощью Delphi - PullRequest
2 голосов
/ 06 января 2011

Я проверил ссылку на usefule , как загрузить файл из интернета, используя Delphi и мой вопрос, связанный, но я был бы признателен за указатель для начала.Мне нужно иметь возможность копировать все файлы из папки веб-сервера в локальную папку.Я не знаю, сколько там файлов, и действительно ли есть подключение к интернету.Есть ли компонент (ы), которые могли бы помочь мне, пожалуйста?Или я могу использовать Windows API?Спасибо Брайан

Ответы [ 4 ]

3 голосов
/ 06 января 2011

Если и только если веб-сервер настроен на просмотр каталогов (большинство серверов этого не делают), вы можете запросить URL-адрес папки, и веб-сервер отправит обратно HTML-файл, содержащий список каталогов.Затем вам придется анализировать HTML-код, чтобы определить отдельные имена файлов, а затем запрашивать их URL-адреса по одному.

Если просмотр каталогов отключен, то невозможно выполнить то, что вы запрашиваете, не знаяимена файлов раньше времени.Использование FTP - лучший выбор, если он доступен.

2 голосов
/ 06 января 2011

Я бы начал с этого ответа и вместо того, чтобы поместить результат вывода в строку, запишите буфер в TFileStream.

WinInet действительно хорош, так как он уважаетнастройки прокси, которые пользователь установил в Windows (так что вам не нужно много работать над тем, чтобы сделать это настраиваемым с помощью Indy).

Редактировать:

Я немного изменил этот ответ, чтобы загрузить двоичные файлы.
Поскольку он использует WinInet, вы можете использовать его как для загрузки по ftp, так и по http (да, я проверил, что это так).
Вы можете расширить это, чтобы использовать FtpFindFirstFile / InternetFindNextFile и чтение целой пачки файлов.

unit DownloadBinaryFileUnit;

interface

uses
  Classes,
  WinInet;

type
  TWinInet = class
  strict protected
    class procedure ReadBinaryFileResponse(const UrlHandle: HINTERNET; const LocalFileName: string); static;
    class procedure ReadResponse(const UrlHandle: HINTERNET; const ContentStream: TStream);
  public
    class procedure DownloadBinaryFile(const UserAgent, Url, LocalFileName: string); overload; static;
  end;


implementation

uses
  SysUtils,
  Variants,
  Windows,
  IOUtils;

class procedure TWinInet.DownloadBinaryFile(const UserAgent, Url, LocalFileName: string);
var
  InternetHandle: HINTERNET;
  UrlHandle: HINTERNET;
begin
  InternetHandle := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    UrlHandle := InternetOpenUrl(InternetHandle, PChar(Url), nil, 0, 0, 0);
    try
      ReadBinaryFileResponse(UrlHandle, LocalFileName);
    finally
      InternetCloseHandle(UrlHandle);
    end;
  finally
    InternetCloseHandle(InternetHandle);
  end;
end;

class procedure TWinInet.ReadBinaryFileResponse(const UrlHandle: HINTERNET; const LocalFileName: string);
var
  ContentStream: TFileStream;
begin
  ContentStream := TFile.Create(LocalFileName);
  try
    ReadResponse(UrlHandle, ContentStream);
  finally
    ContentStream.Free;
  end;
end;

class procedure TWinInet.ReadResponse(const UrlHandle: HINTERNET; const ContentStream: TStream);
var
  Buffer: array[0..1023] of Byte;
  BytesRead: Cardinal;
begin
  repeat
    InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
    ContentStream.Write(Buffer, BytesRead);
  until BytesRead = 0;
end;

end.

- jeroen

1 голос
/ 06 января 2011

Если HTTP-сервер поддерживает WebDAV , вы можете просто подключить сетевой диск и использовать команды файловой системы для перебора файлов на стороне сервера.

Если ваше приложение не имеет прав для создания сетевых дисков, вместо него можно использовать одну из существующих реализаций клиента WebDAV для Delphi.

0 голосов
/ 06 января 2011

Поскольку HTTP фактически не обрабатывает концепцию как папку файлов, вам следует проверить, доступен ли FTP на сервере.

Тем не менее, если вы уверены, что застряли в HTTP, вам сначала нужно найти способ собрать список (полных) URL-адресов для всех файлов и загрузить их один за другим, используя один из техники.

(Вы можете попытаться загрузить более одного одновременно, но достаточный опыт показывает, что пропускная способность - это всего лишь пропускная способность, а загрузка нескольких файлов по одному или всех вместе занимает примерно столько же времени.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...