Upload file to FTP using C #

I am trying to upload a file to an FTP server from C #. The file is loading, but with zero bytes.

private void button2_Click(object sender, EventArgs e) { var dirPath = @"C:/Documents and Settings/sander.GD/Bureaublad/test/"; ftp ftpClient = new ftp("ftp://example.com/", "username", "password"); string[] files = Directory.GetFiles(dirPath,"*.*"); var uploadPath = "/httpdocs/album"; foreach (string file in files) { ftpClient.createDirectory("/test"); ftpClient.upload(uploadPath + "/" + Path.GetFileName(file), file); } if (string.IsNullOrEmpty(txtnaam.Text)) { MessageBox.Show("Gelieve uw naam in te geven !"); } } 
+101
c # file-upload ftp
Mar 07 '13 at
source share
9 answers

The existing answers are correct, but why reinvent the wheel and worry about the lower levels of WebRequest , while WebClient already performing a neat FTP upload:

 using (var client = new WebClient()) { client.Credentials = new NetworkCredential(ftpUsername, ftpPassword); client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile); } 
+248
Oct 14 '14 at 16:23
source share
 public void UploadFtpFile(string folderName, string fileName) { FtpWebRequest request; string folderName; string fileName; string absoluteFileName = Path.GetFileName(fileName); request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/{2}", "127.0.0.1", folderName, absoluteFileName))) as FtpWebRequest; request.Method = WebRequestMethods.Ftp.UploadFile; request.UseBinary = 1; request.UsePassive = 1; request.KeepAlive = 1; request.Credentials = new NetworkCredential(user, pass); request.ConnectionGroupName = "group"; using (FileStream fs = File.OpenRead(fileName)) { byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); Stream requestStream = request.GetRequestStream(); requestStream.Write(buffer, 0, buffer.Length); requestStream.Flush(); requestStream.Close(); } } 

How to use

 UploadFtpFile("testFolder", "E:\\filesToUpload\\test.img"); 

use this in your foreach

and you need to create the folder only once

create a folder

 request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/", "127.0.0.1", "testFolder"))) as FtpWebRequest; request.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse ftpResponse = (FtpWebResponse)request.GetResponse(); 
+39
Mar 7 '13 at 11:54 on
source share

The easiest way

The easiest way to upload a file to an FTP server using the .NET Framework is to use the WebClient.UploadFile method :

 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"); 



Advanced settings

If you need more control that WebClient does not offer (e.g. TLS / SSL encryption , ASCII mode, active mode, etc.), use FtpWebRequest . An easy way is to simply copy the FileStream to an FTP stream 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); } 



Progress monitoring

If you need to track the progress of the download, you must copy the contents in parts:

 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); } } 

For more information about the graphical interface (WinForms ProgressBar ), see the C # example at:
How can we show the progress bar for loading with FtpWebRequest




Download Folder

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

+23
Aug 16 '17 at 5:42 on
source share

The following works for me:

 public virtual void Send(string fileName, byte[] file) { ByteArrayToFile(fileName, file); var request = (FtpWebRequest) WebRequest.Create(new Uri(ServerUrl + fileName)); request.Method = WebRequestMethods.Ftp.UploadFile; request.UsePassive = false; request.Credentials = new NetworkCredential(UserName, Password); request.ContentLength = file.Length; var requestStream = request.GetRequestStream(); requestStream.Write(file, 0, file.Length); requestStream.Close(); var response = (FtpWebResponse) request.GetResponse(); if (response != null) response.Close(); } 

You cannot read send the file parameter to your code, as this is only the file name.

Use the following:

 byte[] bytes = File.ReadAllBytes(dir + file); 

To receive a file, to pass it to the Send method.

+9
Mar 07 '13 at 10:37
source share
 public static void UploadFileToFtp(string url, string filePath, string username, string password) { var fileName = Path.GetFileName(filePath); var request = (FtpWebRequest)WebRequest.Create(url + fileName); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential(username, password); request.UsePassive = true; request.UseBinary = true; request.KeepAlive = false; using (var fileStream = File.OpenRead(filePath)) { using (var requestStream = request.GetRequestStream()) { fileStream.CopyTo(requestStream); requestStream.Close(); } } var response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("Upload done: {0}", response.StatusDescription); response.Close(); } 
+8
Jul 11 '14 at 15:59
source share

In the first example, you need to change those that:

 requestStream.Flush(); requestStream.Close(); 

The first reset and after that.

+2
Oct 28 '13 at 7:43
source share

This works for me, this method will be an SFTP file for a location on your network. It uses SSH.NET.2013.4.7 library.One can just download it for free.

  //Secure FTP public void SecureFTPUploadFile(string destinationHost,int port,string username,string password,string source,string destination) { ConnectionInfo ConnNfo = new ConnectionInfo(destinationHost, port, username, new PasswordAuthenticationMethod(username, password)); var temp = destination.Split('/'); string destinationFileName = temp[temp.Count() - 1]; string parentDirectory = destination.Remove(destination.Length - (destinationFileName.Length + 1), destinationFileName.Length + 1); using (var sshclient = new SshClient(ConnNfo)) { sshclient.Connect(); using (var cmd = sshclient.CreateCommand("mkdir -p " + parentDirectory + " && chmod +rw " + parentDirectory)) { cmd.Execute(); } sshclient.Disconnect(); } using (var sftp = new SftpClient(ConnNfo)) { sftp.Connect(); sftp.ChangeDirectory(parentDirectory); using (var uplfileStream = System.IO.File.OpenRead(source)) { sftp.UploadFile(uplfileStream, destinationFileName, true); } sftp.Disconnect(); } } 
+1
Dec 21 '15 at 10:02
source share

publication date: 06/26/2008

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp

 using System; using System.IO; using System.Net; using System.Text; namespace Examples.System.Net { public class WebRequestGetExample { public static void Main () { // Get the object used to communicate with the server. FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm"); request.Method = WebRequestMethods.Ftp.UploadFile; // This example assumes the FTP site uses anonymous logon. request.Credentials = new NetworkCredential("anonymous", "janeDoe@contoso.com"); // Copy the contents of the file to the request stream. byte[] fileContents; using (StreamReader sourceStream = new StreamReader("testfile.txt")) { fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); } request.ContentLength = fileContents.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(fileContents, 0, fileContents.Length); } using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { Console.WriteLine($"Upload File Complete, status {response.StatusDescription}"); } } } } 
+1
Aug 25 '18 at 10:37
source share

I noticed that -

  • Missing FtpwebRequest.
  • FTP is used as the target, so NetworkCredential is required.

I prepared a method that works like this, you can replace the value of the ftpurl variable with the TargetDestinationPath parameter. I tested this method on winforms application:

 private void UploadProfileImage(string TargetFileName, string TargetDestinationPath, string FiletoUpload) { //Get the Image Destination path string imageName = TargetFileName; //you can comment this string imgPath = TargetDestinationPath; string ftpurl = "ftp://downloads.abc.com/downloads.abc.com/MobileApps/SystemImages/ProfileImages/" + imgPath; string ftpusername = krayknot_DAL.clsGlobal.FTPUsername; string ftppassword = krayknot_DAL.clsGlobal.FTPPassword; string fileurl = FiletoUpload; FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl); ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword); ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftpClient.UseBinary = true; ftpClient.KeepAlive = true; System.IO.FileInfo fi = new System.IO.FileInfo(fileurl); ftpClient.ContentLength = fi.Length; byte[] buffer = new byte[4097]; int bytes = 0; int total_bytes = (int)fi.Length; System.IO.FileStream fs = fi.OpenRead(); System.IO.Stream rs = ftpClient.GetRequestStream(); while (total_bytes > 0) { bytes = fs.Read(buffer, 0, buffer.Length); rs.Write(buffer, 0, bytes); total_bytes = total_bytes - bytes; } //fs.Flush(); fs.Close(); rs.Close(); FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse(); string value = uploadResponse.StatusDescription; uploadResponse.Close(); } 

Let me know in case of any problems, or here is another link that may help you:

https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx

0
Aug 31 '16 at 18:48
source share



All Articles