首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 檔案下載全方案:UrlDownloadToFile、Indy、NMHTTP 與 COM 介面比較

     編輯:Delphi

前言

Delphi 實作檔案下載有多種路徑,從簡單的單一 API 呼叫到功能完整的元件庫。本文整理四種主流方案,比較適用場景、優缺點與程式碼範例。

方案一:UrlDownloadToFile API(最簡潔)

Windows UrlMon.dll 提供的高階 API,支援 HTTP、FTP、本地檔案、LAN 路徑,自動處理 Proxy、重導向、快取。

uses UrlMon;

function DownloadFile(const Source, Dest: string): Boolean;
begin
  try
    // S_OK = 0 表示成功
    Result := UrlDownloadToFile(nil, PChar(Source), PChar(Dest), 0, nil) = 0;
  except
    Result := False;
  end;
end;

// 使用範例
if DownloadFile('https://example.com/file.zip', 'C:\Temp\file.zip') then
  ShowMessage('下載成功')
else
  ShowMessage('下載失敗');

進階:進度回呼與取消

實作 IBindStatusCallback 介面傳入最後一個參數,可接收進度通知、控制中止:

type
  TDownloadCallback = class(TInterfacedObject, IBindStatusCallback)
  public
    function OnProgress(ulProgress, ulProgressMax: ULONG; ...): HRESULT; stdcall;
    // 返回 S_OK 繼續,E_ABORT 取消
  end;

// 呼叫
var
  Callback: IBindStatusCallback;
begin
  Callback := TDownloadCallback.Create;
  UrlDownloadToFile(nil, PChar(URL), PChar(Dest), 0, Callback);
end;

方案二:Indy TIdHTTP(功能最完整)

Indy 元件庫標準配備,支援 HTTPS、認證、斷點續傳、自訂 Header、Cookie 管理。

uses IdHTTP, Classes;

procedure DownloadWithIndy(const URL, DestFile: string);
var
  HTTP: TIdHTTP;
  Stream: TFileStream;
begin
  HTTP := TIdHTTP.Create(nil);
  Stream := TFileStream.Create(DestFile, fmCreate);
  try
    HTTP.HandleRedirects := True;
    HTTP.Request.UserAgent := 'MyApp/1.0';
    // HTTPS 需額外載入 OpenSSL DLL
    HTTP.Get(URL, Stream);
  finally
    Stream.Free;
    HTTP.Free;
  end;
end;

斷點續傳關鍵

var
  ResumeFrom: Int64;
begin
  if FileExists(DestFile) then
    ResumeFrom := FileSize(DestFile)
  else
    ResumeFrom := 0;

  HTTP.Request.Range := Format('bytes=%d-', [ResumeFrom]);
  Stream := TFileStream.Create(DestFile, fmOpenWrite);
  Stream.Seek(0, soFromEnd);
  HTTP.Get(URL, Stream);

方案三:NMHTTP(舊專案常見)

Delphi 早期內建 TNMHTTP(FastNet 元件),語法簡單但功能有限,僅支援 HTTP 1.0。

NMHTTP1.InputFileMode := True;
NMHTTP1.Body := 'LocalFileName'; // 實際上此處為儲存路徑
NMHTTP1.OutputFileMode := False;
NMHTTP1.Get('https://example.com/file.zip');

注意:NMHTTP 已停止更新,不支援 HTTPS、現代認證機制,新專案建議改用 Indy 或 REST Client Library。

方案四:OleCheck + URLDownloadToFile(COM 介面直呼)

uses UrlMon, ActiveX;

OleCheck(URLDownloadToFile(nil, 'URL', 'Filename', 0, nil));

與方案一本質相同,但 OleCheck 會將 HRESULT 自動轉換為例外,適合統一錯誤處理架構。

方案比較總表

特性UrlDownloadToFileIndy TIdHTTPNMHTTP
程式碼複雜度極低(1 行)中等低
HTTPS 支援自動(系統元件)需 OpenSSL DLL不支援
斷點續傳需自行實作 Callback內建 Range 請求不支援
Proxy 設定使用系統預設可程式控制可設定
進度回報IBindStatusCallbackOnWork 事件OnProgress 事件
適用場景簡單下載、系統整合企業級、需客製化維護舊專案

最佳實務建議

  1. 簡單需求:直接用 UrlDownloadToFile,零依賴、零設定。
  2. 需 HTTPS/認證/續傳:使用 Indy,並部署 libeay32.dll、ssleay32.dll。
  3. 大檔案/不穩定網路:實作分塊下載與檢驗和(MD5/SHA256)。
  4. UI 回應性:下載邏輯放入背景執行緒,透過 TThread.Queue 更新進度條。

結語

Delphi 提供從系統 API 到高階元件庫的完整下載方案光譜。理解各方案權衡,根據專案需求選擇最適工具,才能事半功倍。現代新專案首推 Indy 或 REST Client Library,舊專案維護可續用 UrlDownloadToFile 即時升級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved