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;