Как загрузить файл?

{
 The following function shows how to connect to a ftp server
 and download a file.
 It uses the functions from wininet.dll.
 You need a ProgressBar to show the progress and a Label to show progress informations.
}
uses
 WinInet, ComCtrls;
function FtpDownloadFile(strHost, strUser, strPwd: string;
 Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean;
 function FmtFileSize(Size: Integer): string;
 begin
 if Size >= $F4240 then
 Result := Format('%.2f', [Size / $F4240]) + ' Mb'
 else
 if Size < 1000 then
 Result := IntToStr(Size) + ' bytes'
 else
 Result := Format('%.2f', [Size / 1000]) + ' Kb';
 end;
const
 READ_BUFFERSIZE = 4096; // or 256, 512, ...
var
 hNet, hFTP, hFile: HINTERNET;
 buffer: array[0..READ_BUFFERSIZE - 1] of Char;
 bufsize, dwBytesRead, fileSize: DWORD;
 sRec: TWin32FindData;
 strStatus: string;
 LocalFile: file;
 bSuccess: Boolean;
begin
 Result := False;
 { Open an internet session }
 hNet := InternetOpen('Program_Name', // Agent
 INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
 nil, // ProxyName
 nil, // ProxyBypass
 0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE
 {
 Agent contains the name of the application or
 entity calling the Internet functions
 }
 { See if connection handle is valid }
 if hNet = nil then
 begin
 ShowMessage('Unable to get access to WinInet.Dll');
 Exit;
 end;
 { Connect to the FTP Server }
 hFTP := InternetConnect(hNet, // Handle from InternetOpen
 PChar(strHost), // FTP server
 port, // (INTERNET_DEFAULT_FTP_PORT),
 PChar(StrUser), // username
 PChar(strPwd), // password
 INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?
 0, // flag: 0 or INTERNET_FLAG_PASSIVE
 0);// User defined number for callback
 if hFTP = nil then
 begin
 InternetCloseHandle(hNet);
 ShowMessage(Format('Host "%s" is not available',[strHost]));
 Exit;
 end;
 { Change directory }
 bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));
 if not bSuccess then
 begin
 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);
 ShowMessage(Format('Cannot set directory to %s.', [ftpDir]));
 Exit;
 end;
 { Read size of file }
 if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then
 begin
 fileSize := sRec.nFileSizeLow;
 // fileLastWritetime := sRec.lastWriteTime
 end
 else
 begin
 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);
 ShowMessage(Format('Cannot find file ', [ftpFile]));
 Exit;
 end;
 { Open the file }
 hFile := FtpOpenFile(hFTP, // Handle to the ftp session
 PChar(ftpFile), // filename
 GENERIC_READ, // dwAccess
 FTP_TRANSFER_TYPE_BINARY, // dwFlags
 0); // This is the context used for callbacks.
 if hFile = nil then
 begin
 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);
 Exit;
 end;
 { Create a new local file }
 AssignFile(LocalFile, TargetFile);
 {$i-}
 Rewrite(LocalFile, 1);
 {$i+}
 if IOResult <> 0 then
 begin
 InternetCloseHandle(hFile);
 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);
 Exit;
 end;
 dwBytesRead := 0;
 bufsize := READ_BUFFERSIZE;
 while (bufsize > 0) do
 begin
 Application.ProcessMessages;
 if not InternetReadFile(hFile,
 @buffer, // address of a buffer that receives the data
 READ_BUFFERSIZE, // number of bytes to read from the file
 bufsize) then Break; // receives the actual number of bytes read
 if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
 BlockWrite(LocalFile, buffer, bufsize);
 dwBytesRead := dwBytesRead + bufsize;
 { Show Progress }
 ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);
 Form1.Label1.Caption := Format('%s of %s / %d %%', [FmtFileSize(dwBytesRead), FmtFileSize(fileSize), ProgressBar.Position]);
 end;
 CloseFile(LocalFile);
 InternetCloseHandle(hFile);
 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);
 Result := True;
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03375
Category:Связь