FtpWebRequest Télécharger Le Ficher
le code suivant est destiné à récupérer un fichier via FTP. Cependant, je reçois une erreur avec elle.
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) fichier indisponible (par exemple, fichier non trouvé, pas d'accès)
le fichier existe certainement sur la machine distante et je suis capable d'effectuer ce ftp manuellement (i.e. j'ai des permissions). Quelqu'un peut-il me dire pourquoi je peut-être cette erreur?
7 réponses
ce paragraphe du référence de classe FptWebRequest pourrait vous intéresser:
L'URI peut être relatif ou absolu. Si L'URI est de la forme " ftp://contoso.com/%2fpath " (%2f is un évadé '/'), alors L'URI est absolu, et le répertoire courant est /chemin. Si, toutefois, L'URI est la forme " ftp://contoso.com/path ", première l' .NET Framework se connecte au FTP serveur (en utilisant le nom d'utilisateur et mot de passe défini par les Pouvoirs de la propriété), puis le répertoire courant est /chemin d'accès.
je sais qu'il s'agit d'un ancien poste, mais j'ajoute ici pour référence future. Voici une solution que j'ai trouvée:
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");
}
}
Updated based on excellent suggestion by Ilya Kogan
la façon la plus triviale de télécharger un fichier binaire à partir D'un serveur FTP en utilisant .NET framework est d'utiliser 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
, seulement si vous avez besoin d'un plus grand contrôle, que WebClient
n'offre pas (comme le cryptage TLS/SSL, la surveillance de progrès etc). La manière simple est de simplement copier un flux de réponse FTP vers FileStream
en utilisant 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 vous avez besoin de surveiller la progression d'un téléchargement, Vous devez copier le contenu par morceaux vous-même:
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 GUI progress (WinForms ProgressBar
), voir:
FtpWebRequest FTP download with ProgressBar
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 par FTP .
j'ai eu le même problème!
ma solution était d'insérer le dossier public_html
dans L'URL de téléchargement.
emplacement du fichier réel 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 pourra vous aider.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);
après cela, vous pouvez utiliser la ligne ci-dessous pour éviter l'erreur..(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;
}