Microsoft has a C# example of uploading file to FTP server in MSDN https://msdn.microsoft.com/en-us/library/ms229715(v=vs.100).aspx and Microsoft docs https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp:
// Copy the contents of the file to the request stream.StreamReader sourceStream = new StreamReader("testfile.txt");byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());sourceStream.Close();request.ContentLength = fileContents.Length;
Stream requestStream = request.GetRequestStream();requestStream.Write(fileContents, 0, fileContents.Length);requestStream.Close();It uses StreamReader to read a string from a text file, then encode the string to bytes and upload.
This document’s title has a general title “Upload Files with FTP”. However, this approach with StreamReader only works with text file. If the above code is used to upload a binary file, like a picture, the uploaded file on FTP server becomes corrupted. The general options are:
-
Call File.ReadAllBytes to read the bytes, and write to request stream:
byte[] fileContents = File.ReadAllBytes(filePath);using (Stream requestStream = request.GetRequestStream()){requestStream.Write(fileContents, 0, fileContents.Length);} -
Use FileStream to read the file, and copy the file stream to request stream:
public static async Task<FtpStatusCode> FtpUploadAsync(string uri, string userName, string password, string filePath){FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);request.Method = WebRequestMethods.Ftp.UploadFile;request.Credentials = new NetworkCredential(userName, password);// request.UsePassive is true by default.using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))using (Stream requestStream = request.GetRequestStream()){await fileStream.CopyToAsync(requestStream);}using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync()){return response.StatusCode;}} -
Use WebClient, which wraps all the above work flow:
public static async Task FtpUploadAsync(string uri, string userName, string password, string filePath){using (WebClient webClient = new WebClient()){webClient.Credentials = new NetworkCredential(userName, password);await webClient.UploadFileTaskAsync(uri, WebRequestMethods.Ftp.UploadFile, filePath);}}