Delphi 實作檔案下載有多種路徑,從簡單的單一 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 元件庫標準配備,支援 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);
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。
uses UrlMon, ActiveX;
OleCheck(URLDownloadToFile(nil, 'URL', 'Filename', 0, nil));
與方案一本質相同,但 OleCheck 會將 HRESULT 自動轉換為例外,適合統一錯誤處理架構。
| 特性 | UrlDownloadToFile | Indy TIdHTTP | NMHTTP |
|---|---|---|---|
| 程式碼複雜度 | 極低(1 行) | 中等 | 低 |
| HTTPS 支援 | 自動(系統元件) | 需 OpenSSL DLL | 不支援 |
| 斷點續傳 | 需自行實作 Callback | 內建 Range 請求 | 不支援 |
| Proxy 設定 | 使用系統預設 | 可程式控制 | 可設定 |
| 進度回報 | IBindStatusCallback | OnWork 事件 | OnProgress 事件 |
| 適用場景 | 簡單下載、系統整合 | 企業級、需客製化 | 維護舊專案 |
UrlDownloadToFile,零依賴、零設定。libeay32.dll、ssleay32.dll。TThread.Queue 更新進度條。Delphi 提供從系統 API 到高階元件庫的完整下載方案光譜。理解各方案權衡,根據專案需求選擇最適工具,才能事半功倍。現代新專案首推 Indy 或 REST Client Library,舊專案維護可續用 UrlDownloadToFile 即時升級。