subir from files example ejemplo descargar archivos all c# .net ftp ftpwebrequest ftpwebresponse

from - ftpwebrequest sftp c#



FtpWebRequest Descargar archivo (7)

Este párrafo de la referencia de clase FptWebRequest puede ser de su interés:

El URI puede ser relativo o absoluto. Si el URI tiene el formato " ftp://contoso.com/%2fpath " (% 2f es un ''/'' escapado), entonces el URI es absoluto y el directorio actual es / ruta. Sin embargo, si el URI tiene el formato " ftp://contoso.com/path ", primero .NET Framework inicia sesión en el servidor FTP (usando el nombre de usuario y la contraseña establecidos por la propiedad Credentials), luego el directorio actual se establece en / ruta de acceso.

El siguiente código está destinado a recuperar un archivo a través de FTP. Sin embargo, estoy recibiendo un error con él.

serverPath = "ftp://x.x.x.x/tmp/myfile.txt"; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath); request.KeepAlive = true; request.UsePassive = true; request.UseBinary = true; request.Method = WebRequestMethods.Ftp.DownloadFile; request.Credentials = new NetworkCredential(username, password); // Read the file from the server & write to destination using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) // Error here using (Stream responseStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) using (StreamWriter destination = new StreamWriter(destinationFile)) { destination.Write(reader.ReadToEnd()); destination.Flush(); }

El error es:

El servidor remoto devolvió un error: (550) Archivo no disponible (p. Ej., Archivo no encontrado, sin acceso)

El archivo definitivamente existe en la máquina remota y puedo realizar este ftp manualmente (es decir, tengo permisos). ¿Alguien puede decirme por qué podría estar recibiendo este error?


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

Use FtpWebRequest , solo si necesita un mayor control, que WebClient no ofrece (como el cifrado TLS / SSL, el monitoreo de progreso, etc.). Una forma sencilla es simplemente copiar una secuencia de respuesta FTP a FileStream utilizando 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 el contenido por partes:

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 ), vea:
Descarga FTP de FtpWebRequest con ProgressBar

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


Sé que este es un viejo Post pero lo estoy agregando aquí para futuras referencias. Aquí hay una solución que encontré:

private void DownloadFileFTP() { string inputfilepath = @"C:/Temp/FileName.exe"; string ftphost = "xxx.xx.x.xxx"; string ftpfilepath = "/Updater/Dir1/FileName.exe"; string ftpfullpath = "ftp://" + ftphost + ftpfilepath; using (WebClient request = new WebClient()) { request.Credentials = new NetworkCredential("UserName", "P@55w0rd"); byte[] fileData = request.DownloadData(ftpfullpath); using (FileStream file = File.Create(inputfilepath)) { file.Write(fileData, 0, fileData.Length); file.Close(); } MessageBox.Show("Download Complete"); } }

Actualizado basado en excelente sugerencia por Ilya Kogan


Tuve el mismo problema!

Mi solución fue insertar la carpeta public_html en la URL de descarga.

Ubicación real del archivo en el servidor:

myhost.com/public_html/myimages/image.png

URL de la web:

www.myhost.com/myimages/image.png


private static DataTable ReadFTP_CSV() { String ftpserver = "ftp://servername/ImportData/xxxx.csv"; FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver)); reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream responseStream = response.GetResponseStream(); // use the stream to read file from FTP StreamReader sr = new StreamReader(responseStream); DataTable dt_csvFile = new DataTable(); #region Code //Add Code Here To Loop txt or CSV file #endregion return dt_csvFile; }

Espero que te pueda ayudar.


public void download(string remoteFile, string localFile) { private string host = "yourhost"; private string user = "username"; private string pass = "passwd"; private FtpWebRequest ftpRequest = null; private FtpWebResponse ftpResponse = null; private Stream ftpStream = null; private int bufferSize = 2048; try { ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile); ftpRequest.Credentials = new NetworkCredential(user, pass); ftpRequest.UseBinary = true; ftpRequest.UsePassive = true; ftpRequest.KeepAlive = true; ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; ftpResponse = (FtpWebResponse)ftpRequest.GetResponse(); ftpStream = ftpResponse.GetResponseStream(); FileStream localFileStream = new FileStream(localFile, FileMode.Create); byte[] byteBuffer = new byte[bufferSize]; int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize); try { while (bytesRead > 0) { localFileStream.Write(byteBuffer, 0, bytesRead); bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize); } } catch (Exception) { } localFileStream.Close(); ftpStream.Close(); ftpResponse.Close(); ftpRequest = null; } catch (Exception) { } return; }


FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

Después de esto, puede usar la línea de abajo para evitar errores ... (acceso denegado, etc.)

request.Proxy = null;