2006. november 19., vasárnap

How to send files across the internet using FTP


Problem/Question/Abstract:

If I wish to send files to an FTP server how difficult is it to do?

Answer:

After HTTP, FTP is possibly the most used protocols. It allows files to be transferred to and from FTP servers. The only disadvantage with using FTP is that the username and password are sent unencrypted in plain text. Even Internet Explorer can handle FTP.

The FTP protocol is reasonably easy to implement if you know how to use Winsock, but it has already been done by many people so this is probably one wheel you do NOT need to reinvent. The following list includes source code and they are free. ICS (Francois Piette’s superb library at (http://overbyte.delphicenter.com/frame_index.html), Winshoes or Indy as it is now known (and soon to be included in Delphi 6 I believe) at http://www.nevrona.com/Indy/ and MonsterFtp which is on www.torry.net on the Internet part of the VCL section under FTP.

Of these I tried Monster FTP but found a bug using it within a firewall, but Winshoes version 7 (8 is now being released as Indy) worked fine and the code shown below shows just how simple it is to upload files using the FTP. I haven’t tried ICS or any other kits so apologies if I overlooked any.

For any FTP account you need the following:
Username
Password
Server URL (ftp:// …) or IP Address
And optionally, a folder to change to, after the connection is established.

In the code below, ftpObject is a Winshoes TSimpleFTPObject.FtpUpload is a record or class containing Server (Ip Address or Name), Username, Password, Timeout (in milliseconds) and optionally Directory (to change into).  The file transferred is passed in as FilenametoSend.Just add your own error Procedure to deal with errors.

procedure Error(const ErrorString: string);

Depending on the type of file transferred you may wish to transfer files as binary or as Ascii. The only difference is that Ascii transferred files have Carriage Return/Line Feeds added or stripped (according to direction of flow) if between Unix systems and Windows.

Note this needs to be slotted into a procedure or Method.


try
  FtpObject.Hostname := FtpUpload.Server;
  FtpObject.Username := FtpUpload.Username;
  FtpObject.Password := FtpUpload.Password;
  Ftpobject.ConnectTimeout := Ftpupload.Timeout * 1000;

  if not FTPObject.Connect then
  begin
    Error('failed to connect to server');
    exit;
  end;

except
  on E: Exception do
  begin
    Error(Format('Failed to connect to FTP server %s', [FTPUpload.Server]));
    EXIT;
  end;
end;

{ Change Working Directory }
try
  if FtpUpload.Directory <> '' then
    FtpObject.ChangeRemoteDir(FtpUpload.Directory);
except
  on E: Exception do
  begin
    Error(Format('Failed to switch to FTP folder %s', [FtpUpload.Directory]));
    EXIT;
  end;
end;

//FTPObject.Mode(MODE_BYTE);
FTPObject.Transfertype := ttBinary;
LocalFile := CommonExportFolder + FTPUpload.FileNameToSend;
{ Includes date/time in remote file name to keep name unique on a resend }
RemoteFile := Prefix + FormatDateTime('yyyymmddhhnnss', now) + NameList[i];
try
  FTpObject.PutQualifiedFile(LocalFile, RemoteFile);
except
  Error('Failed Copying File ' + Localfile + ' To ' + Remotefile);
end;


Component Download: http://www.nevrona.com/Indy/

To download files there is an equivalent .getQualifiedFile method.

Nincsenek megjegyzések:

Megjegyzés küldése