FtpWebRequest Télécharger le fichier
-
03-10-2019 - |
Question
Le code suivant est destiné à récupérer un fichier via FTP. Cependant, je reçois une erreur avec.
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();
}
L'erreur est:
Le serveur distant a renvoyé une erreur: (550) File indisponible (par exemple, fichier non trouvé, pas d'accès)
Le fichier ne certainement exist sur la machine distante et je suis en mesure d'effectuer ce ftp manuellement (à savoir que j'ai des autorisations). Quelqu'un peut-il me dire pourquoi je pourrais être obtenir cette erreur?
La solution
Ce paragraphe de la classe de référence FptWebRequest de puissance d'intérêt pour vous:
L'URI peut être relative ou absolue. Si l'URI est de la forme " ftp://contoso.com/%2fpath " (% 2f est un échappé « / »), l'URI est absolue, et le répertoire courant est /chemin. Si, toutefois, l'URI est de former " ftp://contoso.com/path", premier le .NET Framework se connecte dans le FTP serveur (en utilisant le nom d'utilisateur et mot de passe fixé par les lettres de créance propriété), le répertoire courant est réglé sur chemin /.
Autres conseils
Je sais que c'est un vieux post, mais j'ajoute ici pour référence future. Voici une solution que je trouve:
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");
}
}
basée sur une excellente Updated suggestion de Ilya Kogan
Meilleure façon
La façon la plus triviale pour télécharger un fichier binaire à partir d'un serveur FTP en utilisant le framework .NET utilise 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");
Options avancées
FtpWebRequest
, seulement si vous avez besoin un contrôle plus que WebClient
ne propose pas (comme TLS / SSL cryptage , le suivi des progrès, etc.). Un moyen facile est de copier juste un flux de réponse FTP à l'aide FileStream
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);
}
Le suivi des progrès
Si vous avez besoin de suivre un cours de téléchargement, vous devez copier le contenu par morceaux vous:
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);
}
}
pour le progrès (GUI WinForms ProgressBar
), voir:
Télécharger FtpWebRequest FTP avec ProgressBar
téléchargement du dossier
Si vous voulez télécharger tous les fichiers d'un dossier distant, voir
C # Télécharger tous les fichiers et sous-répertoires via FTP .
J'ai eu le même problème!
Ma solution a été d'insérer le dossier public_html
dans l'URL de téléchargement.
A l'emplacement du fichier sur le serveur:
myhost.com/public_html/myimages/image.png
Web URL:
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;
}
J'espère que cela peut vous aider.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);
Après cela, vous pouvez utiliser la ligne ci-dessous pour éviter les erreurs .. (accès refusé etc.)
request.Proxy = null;
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;
}