【问题标题】:How to download a folder of files from a web server using Delphi如何使用 Delphi 从 Web 服务器下载文件文件夹
【发布时间】:2011-06-04 08:58:27
【问题描述】:

我已经查看了有用的链接how to download a file from internet using Delphi 和我的相关问题,但我希望得到一个开始的指针。我需要能够将 Web 服务器文件夹中的所有文件复制到本地文件夹。我不知道有多少文件,也不知道是否有互联网连接。请问有没有可以帮助我的组件?或者我可以使用 Windows API 吗? 谢谢 布赖恩

【问题讨论】:

  • 这取决于网络服务器。我认为,在一般情况下,这根本不可能。不过,您可以使用 FTP 而不是 HTTP。然后就很容易了。
  • @Andreas:那就是 FTP!您能否指出相关的 Delphi 组件/示例?非常感谢。
  • @Eugene:我看不出该主题如何帮助我进行查询。
  • 这是您的重复问题。它没有“帮助”-它是重复的。之前已经讨论过这个问题,得出的结论是不能这样做。答案还是一样。

标签: delphi download


【解决方案1】:

当且仅当 Web 服务器配置为允许目录浏览(大多数服务器不允许)时,您可以请求文件夹的 URL,Web 服务器将发回包含目录列表的 HTML 文件。然后,您必须解析 HTML 以确定各个文件名,然后一次请求一个 URL。

如果禁用了目录浏览,那么在不提前知道文件名的情况下就无法执行您要求的操作。如果可用,使用 FTP 是更好的选择。

【讨论】:

  • 谢谢。我很高兴使用 FTP。你能建议怎么做吗?
  • 您可以使用 Jeroen Pluimers 展示的相同代码。 WinInet API 适用于 FTP 和 HTTP。只需使用 FTP URL 而不是 HTTP URL。 WinInet API 也有一些 FTP 特定功能可用,而您现在使用的功能更通用,适用于多种协议。
【解决方案2】:

我将从this answer 开始,而不是将输出结果放在字符串中,而是将缓冲区写入 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.

--杰罗恩

【讨论】:

  • 完美的杰罗恩,谢谢。布赖恩。
【解决方案3】:

如果 HTTP 服务器支持WebDAV,您可以简单地使用map a network drive 并使用文件系统命令来迭代服务器端文件。

如果您的应用程序无权创建网络驱动器,则可以使用 Delphi 的现有 WebDAV 客户端实现之一。

【讨论】:

    【解决方案4】:

    由于 HTTP 实际上并不将概念处理为文件文件夹,因此您应该检查服务器上是否有 FTP。

    不过,如果您确定自己坚持使用 HTTP,则首先必须找到一种方法来收集所有文件的(完整)URL 列表,然后使用技术。

    (然后您可以尝试同时下载多个文件,但丰富的经验告诉我们带宽就是这样:带宽,以及一个一个或一个全部下载多个文件所需的时间差不多。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 2016-10-22
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多