[Gambas-user] ftp Client

Caveat Gambas at ...1950...
Sat Sep 5 10:21:37 CEST 2009


Hi Lars,

Here's some code that should be enough to get you started.  The code is
from a Gambas class which I called RequestManager.  I have cut out some
of the code out as it wasn't relevant to FTP (there was stuff for doing
an HTTP GET and some code for querying services on a particular port).

ISTR there was some flakiness with the FTP client where it bombs out if
you send a blank (empty string) password, so if your FTP server doesn't
require one, just set the FTP client's password to "dummy" or something
and your FTP server *should* ignore it... failing that, you may have to
set a dummy password.

Note the difference between the local file name and the name of the file
you want to get off the server.  The name of the file on the server is
normally included in the url set on FTPClient.URL (see the calling
instructions) and the name of the file on your local machine is passed
to the FTPClient.get method.  If you want to PUT files on the FTP server
instead of GETting them, I'm sure you can adapt the code.

Bear in mind that getting a huge binary file as a string is probably not
a great idea.  My getFileAsString method is really designed to work for
a small textual line-based file.  You'll just need to wrap getFileByFTP
in a different way if you want to deal with binary or larger files.
Give me a shout if you get stuck or something is not clear.

Enough rambling... to use the code, just instantiate a new
RequestManager (or whatever you call the class) and use it as follows:

PRIVATE myRequestManager AS NEW RequestManager

...
DIM allData AS String
allData =
myRequestManager.getFileAsString("192.168.1.2//var/share/dvb2001/services.dat", "root", "password")


Now here follows (some of) the code for the RequestManager class itself:

' Gambas class file
PRIVATE theFTPClient AS NEW FtpClient
PRIVATE eggTimer AS NEW Timer
PRIVATE timedOut AS Boolean
PRIVATE busy AS Boolean
PRIVATE allStates AS Collection

PRIVATE SUB getFileByFTP(url AS String, userName AS String, password AS
String, localFile AS String)
  
  DIM fileName AS String
  
  theFTPClient.URL = url
  theFTPClient.User = userName
  theFTPClient.Password = password
  secondsBeforeTimeout(10)
  theFTPClient.get(localFile)
  DO UNTIL theFTPClient.Status <= 0 OR timedOut = TRUE
    Logger.logMessage("RequestManager.getFileByFTP() status: " &
theFTPClient.Status, FALSE)
    WAIT 0.01
  LOOP
  IF theFTPClient.Status <> 0 THEN
    message("Error in FTP call!  Check password?")
  END IF
  busy = FALSE
CATCH
  Logger.logMessage("getFileByFTP: " & Error.Text & " @ " & Error.Where,
TRUE)
END

PUBLIC FUNCTION getFileAsString(url AS String, userName AS String,
password AS String, tmpDir AS String) AS String

  DIM result AS String  
  DIM fileName AS String
  DIM hFile AS File
  DIM aLine AS String
  fileName = tmpDir &/ "drag_cont_tmp_" & userName & ".tmp"
  Logger.logMessage("RequestManager.getFileAsString() fileName: " &
fileName, FALSE)
  getFileByFTP(url, userName, password, fileName)
  result = ""
  OPEN fileName FOR READ AS #hFile
  WHILE NOT Eof(hFile)
    LINE INPUT #hFile, aLine
    IF aLine <> NULL THEN
      result = result & aLine & gb.NewLine
    END IF
  WEND
  CLOSE #hFile
  RETURN result
CATCH
  Logger.logMessage("getFileByFTPAsString: " & Error.Text & " @ " &
Error.Where, TRUE)
END


PUBLIC SUB eggTimer_Timer()
  
  eggTimer.Enabled = FALSE
  timedOut = TRUE
  Object.Detach(eggTimer)
  
END

PUBLIC FUNCTION isBusy() AS Boolean
  
  Logger.logMessage("RequestManager checked for busy state and was: " &
booleanToString(busy), FALSE)
  RETURN busy
  
END

PRIVATE SUB secondsBeforeTimeout(seconds AS Integer)
  
  Object.Attach(eggTimer, ME, "eggTimer")
  timedOut = FALSE
  eggTimer.Delay = seconds * 1000
  busy = TRUE
  eggTimer.Enabled = TRUE
  
END

PRIVATE FUNCTION booleanToString(value AS Boolean) AS String
  
  IF value THEN
    RETURN "TRUE"
  ELSE
    RETURN "FALSE"
  END IF
  
END

PRIVATE FUNCTION getState(aState AS Integer) AS String
  
  RETURN getAllStates()[aState]
  
END

PRIVATE FUNCTION getAllStates() AS Collection
  
  IF allStates = NULL THEN
    allStates = NEW Collection
    allStates.Add("Accepting", Net.Accepting)
    allStates.Add("Active", Net.Active)
    allStates.Add("CannotBindSocket", Net.CannotBindSocket)
    allStates.Add("CannotCreateSocket", Net.CannotCreateSocket)
    allStates.Add("CannotListen", Net.CannotListen)
    allStates.Add("CannotRead", Net.CannotRead)
    allStates.Add("CannotWrite", Net.CannotWrite)
    allStates.Add("Connected", Net.Connected)
    allStates.Add("Connecting", Net.Connecting)
    allStates.Add("ConnectionRefused", Net.ConnectionRefused)
    allStates.Add("HostNotFound", Net.HostNotFound)
    allStates.Add("Inactive", Net.Inactive)
    allStates.Add("Internet", Net.Internet)
    allStates.Add("IPv4", Net.IPv4)
    allStates.Add("Local", Net.Local)
    allStates.Add("Pending", Net.Pending)
    allStates.Add("ReceivingData", Net.ReceivingData)
    allStates.Add("Searching", Net.Searching)
    allStates.Add("Unix", Net.Unix)
  END IF
  RETURN allStates
  
END

On Thu, 2009-09-03 at 14:24 +0200, Lars Hoeger wrote:
> Hello,
> 
> I would like to use the ftpclient component, but there is no documentation. Has anyone some code-examples?
> 
> Thanks,
> Lars
> gambas 2.15
> 
> 
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
> trial. Simplify your report design, integration and deployment - and focus on 
> what you do best, core application coding. Discover what's new with 
> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user





More information about the User mailing list