c# .net ftp webclient ftpwebrequest

Cargue y descargue un archivo binario a/desde el servidor FTP en C#/. NET



.net webclient (1)

Subir

La forma más trivial de cargar un archivo binario a un servidor FTP usando .NET framework es usar 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");

Si necesita un mayor control, que WebClient no ofrece (como cifrado TLS / SSL , etc.), use FtpWebRequest . La manera fácil es simplemente copiar un FileStream a una transmisión FTP usando 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); }

Si necesita monitorear un progreso de carga, debe copiar los contenidos por partes usted mismo:

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

Para el progreso de la GUI (WinForms ProgressBar ), consulte:
¿Cómo podemos mostrar la barra de progreso para cargar con FtpWebRequest

Si desea cargar todos los archivos de una carpeta, vea
Cargue el directorio de archivos usando WebClient .

Descargar

La forma más trivial de descargar un archivo binario desde un servidor FTP usando .NET framework es usar 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");

Si necesita un mayor control, que WebClient no ofrece (como cifrado TLS / SSL , etc.), use FtpWebRequest . La manera fácil es simplemente copiar una secuencia de respuesta FTP a FileStream usando 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); }

Si necesita monitorear el progreso de una descarga, debe copiar los contenidos usted mismo:

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

Para el progreso de la GUI (WinForms ProgressBar ), consulte:
Descarga FTP de FtpWebRequest con ProgressBar

Si desea descargar todos los archivos de una carpeta remota, vea
C # Descargue todos los archivos y subdirectorios a través de FTP .

Estoy usando .NET 4 C #. Estoy intentando cargar y luego descargar un archivo ZIP en (mi) servidor.

Para subir tengo

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

Esto parece funcionar, ya que obtengo un archivo en el servidor del tamaño correcto.

1) ¿Cómo lo transmito, en lugar de cargarlo primero en la memoria? Subiré archivos muy grandes.

Y para descargar tengo

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) Todo parece funcionar ... excepto cuando trato de descomprimir el archivo ZIP descargado obtengo un archivo ZIP no válido.