Download and upload the binary to / from the FTP server in C # /. NET

I am using .NET 4 C #. I am trying to upload and then upload a zip file to (my) server.

I have to download

using (WebClient client = new WebClient()) { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(MyUrl); request.Method = WebRequestMethods.Ftp.UploadFile; request.EnableSsl = false; request.Credentials = new NetworkCredential(MyLogin, MyPassword); byte[] fileContents = null; using (StreamReader sourceStream = new StreamReader(LocalFilePath)) { fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); } request.ContentLength = fileContents.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(fileContents, 0, fileContents.Length); } FtpWebResponse response = null; response = (FtpWebResponse)request.GetResponse(); response.Close(); } 

This seems to work because I get the file on the server of the right size.

1) How can I transfer it, and not load it into memory first? I will upload very large files.

And for download I have

 using (WebClient client = new WebClient()) { string HtmlResult = String.Empty; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(remoteFile); request.Method = WebRequestMethods.Ftp.DownloadFile; request.EnableSsl = false; request.Credentials = new NetworkCredential(MyLogin, MyPassword); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) using (FileStream writer = new FileStream(localFilename, FileMode.Create)) { long length = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[2048]; readCount = responseStream.Read(buffer, 0, bufferSize); while (readCount > 0) { writer.Write(buffer, 0, readCount); readCount = responseStream.Read(buffer, 0, bufferSize); } } } 

2) Everything seems to work ... except when I try to unzip the downloaded ZIP file, I get an invalid ZIP file.

+3
c # ftp webclient ftpwebrequest
Jun 17 '17 at 14:58
source share
1 answer

Download

The most trivial way to upload a binary file to an FTP server using the .NET framework is WebClient.UploadFile :

 WebClient client = new WebClient(); client.Credentials = new NetworkCredential("username", "password"); client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip"); 

If you need stronger control, WebClient does not offer (for example, TLS / SSL encryption, etc.), use FtpWebRequest . An easy way is to simply copy the FileStream stream to FTP using Stream.CopyTo :

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip")) using (Stream ftpStream = request.GetRequestStream()) { fileStream.CopyTo(ftpStream); } 

If you need to track the progress of the download, you need to copy the contents of the pieces themselves:

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip")) using (Stream ftpStream = request.GetRequestStream()) { byte[] buffer = new byte[10240]; int read; while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0) { ftpStream.Write(buffer, 0, read); Console.WriteLine("Uploaded {0} bytes", fileStream.Position); } } 

To achieve the GUI (WinForms ProgressBar ) see:
How to show a progress bar to download using FtpWebRequest

If you want to download all files from a folder, see Download a file directory using WebClient .




Download

The most trivial way to download a binary file from an FTP server using the .NET framework is using WebClient.DownloadFile :

 WebClient client = new WebClient(); client.Credentials = new NetworkCredential("username", "password"); client.DownloadFile( "ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip"); 

If you need stronger control, WebClient does not offer (for example, TLS / SSL encryption, etc.), use FtpWebRequest . Easily copy an FTP response stream to a FileStream using Stream.CopyTo :

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.DownloadFile; using (Stream ftpStream = request.GetResponse().GetResponseStream()) using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) { ftpStream.CopyTo(fileStream); } 

If you need to track the progress of the download, you need to copy the contents of the pieces themselves:

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.DownloadFile; using (Stream ftpStream = request.GetResponse().GetResponseStream()) using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) { byte[] buffer = new byte[10240]; int read; while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0) { fileStream.Write(buffer, 0, read); Console.WriteLine("Downloaded {0} bytes", fileStream.Position); } } 

To achieve the GUI (WinForms ProgressBar ) see:
FtpWebRequest FTP Upload Using ProgressBar

If you want to download all files from a remote folder, see
C # Uploading all files and subdirectories via FTP .

+5
Jun 17 '17 at 19:20
source share



All Articles