You can upload files using CGI
module no trouble - see
the CREATING A FILE UPLOAD FIELD
section in the documentation.
You would use the webserver and http to download files - just emit an <a href="file.txt"> as usual in your output for the user to click on.
If you want this logged then either look in the web logs or make
the cgi return the file eg, <a href="my.cgi?file=file.txt">. Make sure the files
aren't directly accessible by the webserver in this case.
CGI doesn't deal with FTP. In fact I suggest you steer clear of FTP - it is hard to set up securely. You can investigate the Net::FTPServer module if you are desperate for FTP.