B4A Library Automated FTP Library

New Automated FTP Library


UPDATED 3-24-2014 - Version 1.06 changes the display scale and should look better on the larger display of a tablet. A sample project is now included which shows how to use this library. The sample code requires B4A 3.2+. You can open and view the code with older versions but it will not run because of the newer layout files.


UPDATED 1-24-2014 - Version 1.05 adds a new function for checking for files or folders. It also contains a few other small fixes.
The new command works for Files or Folders. If the last parameter is set to TRUE, it will look for folders, if the last parameter is set to FALSE it will look for files. Because the code runs in the background and is modeless you must have a callback sub in the calling module. Code samples below:

B4X:
'Call the command like this:
FTP.FileOrFolderExist("plane.jpg" , "test/files", False)

B4X:
'Callback sub in calling module:
Sub FTP_FileExist(Found As Boolean)
    If Found Then Log("True") Else Log("False")
End Sub

UPDATED 4-2-2013 - Version 1.02 Corrects an issue where PassiveMode was not working and also corrects an issue where UploadFileSet would not work from File.DirInternal.

Automates the process of sending and receiving files using FTP with Wildcards & File Masks. Version 1.02 is attached. Please post/report back any issues you find, etc.

This library has progress bars for Each File and overall progress. It handles wildcards and multi file types at the same time. Issue one command and transfer multiple files and multiple types! Change the colors, text size and words of all objects on the Progress Dialog to fit the look of your app. Also works in Stealth Mode!

REQUIRES: B4A 2.5 +
Copy the FTP_Auto.jar & FTP_Auto.xml files to the Extra Libraries folder.


ss.png


FTP_Auto
  • Close
    Completes the current Que with any files left to process and then
    closes the connection.
  • CloseNow
    Closes the connection and all other files in the Que are
    ignored and the process is terminated.
  • DeleteFile (DeletePathAndFile As String)
    Deletes a single file from the server.
    Example:

    DeleteFile("public/pictures/airplane1.jpg")
  • DeleteFileSet (VerifyBeforeDelete As Boolean)
    Delete the lastest FileSet in memory from the server.
    If you used a Mask to download a set of files, this function
    will delelete all files in that last set.
    NOTICE: use with care.
  • DownLoadFile (LocalPath As String, ServerPath As String, FileName As String, Delete_FromServer As Boolean)
    Downloads a selected file from the FTP server and optionally deletes the file after successful download
    Example:

    DownLoadFile("/mnt/sdcard/pictures/", "public/downloads/", "airplane.jpg", False)
  • DownloadFileSet (LocalPath As String, Files_Path_And_Mask() As String, Delete_FromServer As Boolean)
    Retrieves a list of files from the server matching the Mask(s) passed to Files_Path_And_Mask() array.
    You should include the full server path in the Mask. It will then download these files to
    the Folder passed in LocalPath. Files_Path_And_Mask() can contain one entry or however many is needed.
    Example:

    DownloadFileSet(File.DirInternal, Array As String("SM*.txt", "public/pictures/pla*.jpg"), False)
  • IsInitialized As Boolean
    Tests whether the object has been initialized.
  • Initialize (Activity As Activity, CalledFrom As Object, FTP_Site As String, UserName As String, PassWord As String, PortNumber As Int, ShowMessages As Boolean, UsePassiveMode As Boolean) As String
    Initializes the object for use. If True is passed for ShowMessages, additional
    messages will be displayed throughout the process. Use the keywords "Activity"
    and "Me" For the first two parameters.
    Example:

    Initialize(Activity, Me, "ftp.yourdomain.com", "userName", "PassWord", "Port", True, False)
  • LastDownloadStats ( As ) As String
    Shows a popup window with the detials of the latest Download(s).
  • LastProcessSuccessful As Boolean
    Returns True if the last Upload or Download process was successful, otherwise returns False.
  • LastUploadStats ( As ) As String
    Show a popup window with details of the latest Upload(s).
  • MakeDir (DirectoryName As String)
    Makes a directory on the FTP server. Does nothing if the directory already exist.
    If you want to make a directory in the root of the server and then a directory under
    it, you must issue the command twice.
    Example:

    MakeDir("test")
    MakeDir("test/datafolder")
  • RemoveDir (DirectoryName As String)
    Removes selected directory from the FTP server
  • SetColors (HeadingColor As Int, TotalProgressColor As Int, FileTextColor As Int, PanelBackgroundColor As Int, FrameColor As Int)
    Used to set colors of each Item in the status dialog.
    NOTE: Passing 0 for any argument with leave that item unchanged
  • SetCompletedDownloadDialog (ShowCompletedDialog As Boolean, DialogText As String)
    If ShowCompletedDialog=True, it will show a dialog after the download process is completed.
  • SetCompletedUploadDialog (ShowCompletedDialog As Boolean, DialogText As String)
    If ShowCompletedDialog=True, it will show a dialog after the upload process is completed.
  • SetProcessCompleteOn (ProcessCompleteOn As Boolean)
    Use this function to determine by code when the Upload or Download is finished.
    The calling Activity must contain a sub named FTP_ProcessComplete. If your calling
    Activity includes this sub and you set this function to True, then the sub will
    be called as soon as the process has completed. EXAMPLE:

    'Add this sub to calling Activity
    Sub FTP_ProcessComplete
    'Your code here...
    End Sub
  • SetStealthOn (UseStealth As Boolean)
    If set to True, no progress box will be displayed during the file
    transfer. If False the progress dialog will show during the file
    transfers. The default is False.
  • SetStickyOn (MakeSticky As Boolean)
    If set to True, the progress box will stay on the screen until
    the user taps the Done button, otherwise the progress box will close
    as soon as the transfer is complete. The default is False.
  • SetText (HeaderDownLoadText As String, HeaderUploadText As String, TotalProgressText As String, FileProgressText As String, ButtonCancelText As String, ButtonDoneText As String)
    Used to set the Text of the Item's status display.
    NOTE: May be used for different language, etc.
  • SetTextSize (HeaderTextSize As Int, TotalProgressTextSize As Int, FileProgressTextSize As Int, CancelAndDoneTextSize As Int)
    Used to set the Text size of the Item's Text in the status dialog.
    NOTE: Passing 0 for any argument with leave that item unchanged
  • UpLoadFile (LocalPath As String, ServerPath As String, FileToSend As String)
    Uploads a single file passed in FileToSend

    Example: UpLoadFile("/mnt/sdcard/pictures", "uploads/pictures", "vacation.jpg")
  • UploadFileSet (ServerPath As String, Files_Path_And_Mask() As String, DeleteFileFromLocalDevice As Boolean)
    Retrieves a list of files from the local device. The Files_Path_And_Mask() array should contain the full
    path to the local devices files. It will then upload these files to the server.
    Files_Path_And_Mask() array can contain one entry or however many is needed.
    Example:

    UploadFileSet("uploads/pictures/", Array As String("/mnt/pictures/VA*.jpg", "/mnt/sdcard/backups/contact*.dat"), False)
  • WiFi_IsConnected As Boolean
    Check if Wifi is connected
    Returns True if connected otherwise returns False

Permissions:
◦android.permission.ACCESS_WIFI_STATE
◦android.permission.INTERNET
 

Attachments

  • Automated FTP Version 1.05.zip
    14.8 KB · Views: 968
  • Automated FTP Version 1.06.zip
    14.3 KB · Views: 1,609
  • FTP_Auto_Sample_Code_1.06.zip
    322.9 KB · Views: 1,770
Last edited:

HDSInformatics

Member
Licensed User
Longtime User
Hi Michael,

With the latest lib version (thanks again Margret), everything works perfectly, the library is very simple/fast to use and helped me a lot with the simplification of sending/receiving files to/from FTP server. again :wav:

Oh god... I wrote the wrong thing. I said it's in the NET library and not in the FTP_auto library but it's the other way around...
Pardon me
 

cjolly

Member
Licensed User
Longtime User
problem with UsePassiveMode

Hi Margret,

Apparently, the definition of UsePassiveMode (Initialize) is not working properly, always in active mode (sending by port 21 and waiting on port 20), can you verify please. :sign0085:

*TIA*
 

cjolly

Member
Licensed User
Longtime User
The code is there to support this, it could of been the order the commands where called. I changed that. Before I update post #1, can you please check the attached lib and see if it's working now.

Thanks

Genius, now pasive and active works ok in FTP_Auto

The bad new is the NET library has the same problem, maybe somebody can check this before report a bug? NO ERROR IT'S OK :sign0013:

Thanks again
 
Last edited:

cjolly

Member
Licensed User
Longtime User
Margret,

FTP_Auto can be used as a service?

If YES, how?
 

upsis

Member
Licensed User
Longtime User
Wish list

Congratulations, excelent library. I suggest a command to check if file exists in server.
 

Smee

Well-Known Member
Licensed User
Longtime User
Hi Margret,

I have not used this library as yet but looking forward to trying. I have previously used the net lib for ftp and used tricks to get around the 20 file synchrounous download limit, Is there any limit with this lib? Can i just use an array list or for next loop to download an unknown number of files?

Thanks for your contributions

Joe

UPDATE:

I tried the lib with one file

B4X:
FTP1.Initialize(Activity,Me,"www.xxx.com","xxxxxx","xxxxxx",21,False,False)
FTP1.SetProcessCompleteOn(True)
FTP1.SetStealthOn(True)
FTP1.DownLoadFile(File.DirRootExternal,"Jpegs/","635742_100.jpg",False)

The file downloads fine, however i still see the download box with progress bars. also the following sub does not fire

B4X:
Sub FTP1_ProcessComplete
Log("Complete")
End Sub
 
Last edited:

Smee

Well-Known Member
Licensed User
Longtime User
Thanks for the reply margret,

Using the latest lib. I am also using the NET library for SMS messages, that is why i changed the Dim FTP1 As FTP_Auto.

i think FTP is a reserved word when the net lib is in use, is this not correct?

Thanks

Update:

i changed the code to
B4X:
Sub ftpDownload

FTP.Initialize(Activity,Me,"xx","xx","xx",21,False,False)
FTP.SetStealthOn(True)
FTP.SetProcessCompleteOn(True)
FTP.DownLoadFile(File.DirRootExternal,"635742_100.jpg",False)
End Sub

and the Sub FTP_ProcessComplete fires correctly now, however the download box still appears
 
Last edited:

margret

Well-Known Member
Licensed User
Longtime User
The FTP is reserved if used like FTP.something, but when using it with a continued name like: FTP_ProcessComplete, this is not a problem.

As for the Stealth mode not working, that is strange. I have looked at the code and tested it again and this works fine in my app. One thing, I have another panel or layout loaded. Do you have anything in your activity or is it just the FTP code? It may be some issue with it being the only dialog in the activity. Also, what version of Android are you using this on because you are the only one that has reported this issue and I want to make sure I get it fixed. Also, if you can, it would help to see your code.

You also can have Dim FTP1 as FTP_Auto and the sub name would still need to be FTP_ProcessComplete. FTP_ProcessComplete is the sub name the library looks for, it has nothing to do with what you Dim as FTP_Auto. You could have: Dim Jimmy As FTP_Auto and it will still look for: FTP_ProcessComplete. Hope this helps make this clearer. As long as the sub FTP_ProcessComplete is there it will be called and you can Dim anything you like as FTP_Auto.
 
Last edited:

Smee

Well-Known Member
Licensed User
Longtime User
Thx Margret,

I called the code very early in the program to test so it may well be because other items have not been loaded properly.
I will do some further testing and if i cannot get it right i will send you the code. Incidentally it is on a Note II.

I am using ver 2.5
 

Smee

Well-Known Member
Licensed User
Longtime User
ok i used a timer to call the ftp download and i still get the display.



B4X:
Dim FTP As FTP_Auto

Sub Timer2_Tick
ftpDownload

Timer2.Enabled=False
End Sub


Sub ftpDownload
FTP.Initialize(Activity,Me,"xxx","xxx","xxx",21,False,False)
If FTP.WiFi_IsConnected=False Then Return

FTP.SetProcessCompleteOn(True)
FTP.SetStealthOn(True)
FTP.DownLoadFile(File.DirRootExternal,"/Jpegs/","*.jpg",False)
End Sub

Sub FTP_ProcessComplete
'Your code here...
Log("Complete")
End Sub
 

Attachments

  • screenshot.jpg
    screenshot.jpg
    24.7 KB · Views: 278

Smee

Well-Known Member
Licensed User
Longtime User
Margret,

I tried with the AHViewPager example and added the code routines to the example and i get the same result. i also tried it with a very small sample program called guess my number and i get the same result.

It could be a NOTE 2 thing?

Android SDK ver 2.2
 
Last edited:

doncx

Active Member
Licensed User
Longtime User
Progress ; the user interface

Margret -

Your library works fabulously and effortlessly. Thank you very much for sharing.

I'm trying to improve the user interface and am unable to change the size of the progress display, which appears *very* small on tablets, so much so that the words don't fit correctly.

Is there a way to size the progress panel?

Alternatively, is there a way to access the actual progress to build a custom progress interface?

Thanks,

- Don
 

Smee

Well-Known Member
Licensed User
Longtime User
If you want to export a test project that shows this issue, I will see if I can find and fix the issue.

Here you go. i am starting to think that it might be an issue with the NoteII

Hopefully this can be a simple fix because i am not REQUIRED to show a dialogue in this particular app.

Thanks again
 

Attachments

  • Test FTP.zip
    6.9 KB · Views: 288
Last edited:

Smee

Well-Known Member
Licensed User
Longtime User
EXCELLENT Margret. It works great now. Thanks very much for your efforts and your library. :sign0060::sign0060::sign0060::sign0098:

Joe
 
Top