Introduction
An addition to the Microsoft .NET framework 2.0 to 1.x is the support for FTP. All these days we had to rely on 3rd party libraries which pretty well suited most of our needs, but for sure, there is an extra pleasure using the .net framework library classes. The code included is not designed to be a fulfledged reusable library, but rather an easy to use and reusable pieces of code which is easily comprehensible and can be reused and tweaked to fit your specific needs. Therefore the code for each functionality(upoad, download, delete etc...) can be easy picked up separately and reused. The main motive behind this article was the unavailability of .net2.0 ftp sample codes and their usage in C#; may be because its a new entrant to the .net scenario, or the third party implementations available were working pretty well, that this area of the .net2.0 library haven't got enough focus.
Background
I started working on this FTP module as part of my official work, but the requirement soon changed and I had to do it for .net 1.1. So, I haven't travelled deeper into the rabbit hole. But I believe this gives a good, instant start for using the FTP support in .net 2.0.
Using the code
Don't forget to add the following directive:
using System.Net;
using System.IO;
The following steps can be considered as a generic procedure of getting an FTP request executed using FtpWebRequest object:
- Create an
FtpWebRequestobject over an ftp server Uri - Set the ftp method to execute (upload, download, etc.)
- Set options(ssl support, transfer as binary/not etc.) for the ftp webrequest.
- Set the login credentials(username, password)
- Execute the request.
- Recieve the response stream(if required).
- Close the FTP Request, in addition to any open streams.
One point to watch out while coding for any ftp application is to have the settings for the ftp request proper to suit the ftp server and its specific configurations. FtpWebRequest object exposes many poperties to have these settings in place.
The sample for the upload functionality is as follows:
First a uri is created which represents the ftp address along with the filename(directory structure included). This uri is used to create the FtpWebRequest instance.
Then properties of the FtpWebRequest object are set, which determines the settings for the ftp request.
Some of its important properties are:
- Credentials - specifies the username and password to login to the FTP server.
- KeepAlive - specifies if the control connection should be closed or not after the request is completed. By default it is set to true.
- UseBinary - denotes the datatype for file transfers. The 2 modes of file transfer in this case are Binary and ASCII. At bit level both vary in the 8th bit of a byte. ASCII uses 8th bit as insignificant bit for error control, where as, for binary all the 8 bits are significant. So take care when you go for the ASCII transmission. To be simple, all those files that open and read well in notepad are safe as ascii. Executables, formatted docs etc should be send using binary mode. BTW sending ASCII files as binary works fine most of the time.
- UsePassive - specifies to use either active or passive mode. Earlier active FTP worked fine with all clients, but now a days as most of the random ports will blocked by firewall, the active mode may fail. The passive FTP is helpful in this case. But still it causes issues at the server. The higher ports requested by client on server may also be blocked by firewall. But since FTP servers will need to make their servers accessible to the greatest number of clients, they will almost certainly need to support passive FTP. The reason why passive mode is considered safe is that, it ensures all data flow initiation comes from inside(client) the network rather than from the outside(server).
- Contentlength - setting this property is useful for the server we request to but is not of much use for us(client), because FtpWebRequest usually ignores this property value, so it will not be available for our use in most of the cases. But if we set this property, the FTP server will get an idea in advance about the size of the file it should expect(in case of upload).
- Method - Denotes what action(command) to take in the current request.(upload, download, filelist etc.) It is set a value defined in the WebRequestMethods.Ftp structure.
private void Upload(string filename)
{
FileInfo fileInf = new FileInfo(filename);
string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
FtpWebRequest reqFTP;
// Create FtpWebRequest object from the Uri provided
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name));
// Provide the WebPermission Credintials
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
// By default KeepAlive is true, where the control connection is not closed
// after a command is executed.
reqFTP.KeepAlive = false;
// Specify the command to be executed.
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
// Specify the data transfer type.
reqFTP.UseBinary = true;
// Notify the server about the size of the uploaded file
reqFTP.ContentLength = fileInf.Length;
// The buffer size is set to 2kb
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
// Opens a file stream (System.IO.FileStream) to read the file to be uploaded
FileStream fs = fileInf.OpenRead();
try
{
// Stream to which the file to be upload is written
Stream strm = reqFTP.GetRequestStream();
// Read from the file stream 2kb at a time
contentLen = fs.Read(buff, 0, buffLength);
// Till Stream content ends
while (contentLen != 0)
{
// Write Content from the file stream to the FTP Upload Stream
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
// Close the file stream and the Request Stream
strm.Close();
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Upload Error");
}
}
Kumar HarshPosted Nov 1, 2013, 10:16 AM
onur add ftp.UsePassive = false;
onurPosted Sep 19, 2013, 10:05 AM
just make directory work for me. the other functions return this error "The remote server returned an error: 227 Entering Passive Mode" can anyone help me about this?
IrynaPosted Apr 2, 2013, 3:40 PM
_FtpWebRequest.EnableSsl = true; if (_FtpWebRequest.EnableSsl) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); } I am getting error on line: System.IO.Stream _Stream = _FtpWebRequest.GetRequestStream(); "The remote server returned an error: (502) Command not implemented" It's working when EnableSsl = false. Could you please help? Thank you.
AnandPosted Mar 3, 2013, 11:35 PM
very useful... Thanks for sharing :)
Closca CostelPosted Aug 7, 2012, 6:36 AM
Hello. It's working perfect and I really like your example. I wonder if it's possible to use an progress bar so user can see what is happening.
Gautam saraswatPosted Dec 31, 2010, 6:01 AM
good one thanks for support
sagar kandikatlaPosted Sep 7, 2010, 6:13 AM
i am getting "System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly" problem with proxy server network. please help me how to avoid that.. thanks in advance regards sagar.k [email protected]
vatu HzPosted Aug 6, 2010, 2:53 PM
Thanks!!! If you have the error "Error 502 Bad gateway" or "The requested FTP command is not supported when using HTTP proxy." try this: reqFTP.Proxy = null; It works ok in my case
pardhasaradhi kogantiPosted Apr 9, 2010, 12:17 PM
can i get a sample console application to download a file from ftp to local file system please its urgent
brinda ashokanPosted Oct 25, 2009, 1:42 PM
hi .. i'm trying to upload a file to an ftp server from an application that is deployed online. this code works fine if it is from my localhost but if its deployed online then i get an error "System.IO.FileNotFoundException: Could not find file" . It seems to be looking at the server side for the folder to be uploaded. how can i point to the client machine folder?
Jose Camilo SernaPosted Jun 5, 2009, 4:01 PM
Hi Mohammed, your articule is really good... Thanks, but i have one issue when trying to uses the code for getting the directory list. it is returned with a bunch of html tags, do you know how can i eliminate this tag, so i can show only the files name and extention. Thanks in advance.
rathankumar sPosted Dec 11, 2008, 5:11 AM
how can i achive this in asp.net webapplications?? is this possible?
Ignacio Martin VidalPosted Oct 1, 2008, 1:46 PM
It's a great code. but I have a problem because, I've to upload a file but my ftp server has a particular Prort so, how can I especify the ftp port?
Abdallah HefniPosted Feb 12, 2008, 3:35 AM
Thanks for program. but when i click GetFileDetails Button I see Html tages in list box whats problem
JeroenPosted Jan 31, 2008, 4:23 AM
Hello mr. Habeeb, I have a question. Your program/code does exactly do what I want. But the only problem is I need to do this for a PPC. So I need to use the compact framework. Do you know if, and if so, how this is possible? Hope it works and thank you for your time Jeroen
Aniruddha SurangePosted Mar 2, 2007, 8:57 AM
Great!!! I want to be more clear on how to upload files from a specific folder? Can you provide some working examples? Thnx. Aniruddha