FTPWEBREQUESTダウンロードファイル
-
03-10-2019 - |
質問
次のコードは、FTPを介してファイルを取得することを目的としています。ただし、エラーが発生しています。
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();
}
エラーは次のとおりです。
リモートサーバーはエラーを返しました:(550)ファイルは利用できません(たとえば、ファイルが見つかりません、アクセスなし)
ファイルは間違いなくリモートマシンに存在し、このFTPを手動で実行することができます(つまり、アクセス許可があります)。なぜ私がこのエラーを受け取っているのか誰か教えてもらえますか?
解決
からのこの段落 fptwebrequestクラス参照 あなたにとって興味深いかもしれません:
URIは相対的または絶対的なものである可能性があります。 URIがフォームの場合」ftp://contoso.com/%2fpath「(%2fは逃げられた ' /')、URIは絶対的であり、現在のディレクトリは /パスです。ただし、URIがフォームの場合」ftp://contoso.com/path「最初に、.NETフレームワークがFTPサーバーにログに記録されます(資格情報プロパティによって設定されたユーザー名とパスワードを使用)、現在のディレクトリは /パスに設定されます。
他のヒント
私はこれが古い投稿であることを知っていますが、将来の参照のためにここに追加しています。これが私が見つけた解決策です:
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");
}
}
Ilya Koganによる優れた提案に基づいて更新されました
最も簡単な方法
.NETフレームワークを使用してFTPサーバーからバイナリファイルをダウンロードする最も些細な方法は使用しています 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");
高度なオプション
使用する FtpWebRequest
, 、より大きなコントロールが必要な場合にのみ、 WebClient
提供していません(次のように TLS/SSL暗号化, 、進捗監視など)。簡単な方法は、FTP応答ストリームをにコピーすることです 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);
}
進捗監視
ダウンロードの進行状況を監視する必要がある場合は、自分でチャンクによって内容をコピーする必要があります。
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);
}
}
GUI Progress(winforms ProgressBar
)、 見る:
ftpwebrequest ftp download with progressbar
フォルダーのダウンロード
リモートフォルダーからすべてのファイルをダウンロードする場合は、参照してください
C#FTPからすべてのファイルとサブディレクトリをダウンロードします.
同じ問題がありました!
私の解決策は、挿入することでした public_html
ダウンロードURLへのフォルダー。
サーバー上の実際のファイルの場所:
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;
}
私はそれがあなたを助けることができることを願っています。
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);
この後、エラーを回避するために以下の行を使用できます。(アクセス拒否など)
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;
}