基于C#的開源庫FluentFTP全面介紹
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
前言FluentFTP是提供給.NET和.NET Standard使用的,一個完全由托管的FTP和FTPS實現的經過速度優化的類庫。它提供了全面的FTP的指令,功能包括文件上傳/下載,SSL/TLS連接,自動目錄清單列表解析,文件哈希/校驗和,文件權限/CHMOD權限,FTP代理,UTF-8編碼支持,Async/await支持,Powershell支持等等。 FluentFTP完全是由C#語言編寫的,并且沒有額外的依賴。它是在寬松的MIT許可下發布的,因此,FluentFTP既可以用于私有的應用程序,也可以用于自由/開源的應用程序。 如果你需要讓一個特定的問題優先進行支持,可以考慮使用IssueHunt為處理這個問題提供資金資助。 特性
發布穩定的二進制文件在NuGet上發布,包含在.NET/CLR應用程序中使用FTP/FTPS所需的所有內容。相關的用法,請參閱下面的示例用法的部分和文檔的部分。
FluentFTP工作在.NET和.NET Standard/.NET Core。
這些平臺也支持FluentFTP:(通過.NET Standard)
所有平臺的二進制文件都是由一個VS 2017項目來構建的。您需要使用VS 2017來構建或者修正FluentFTP。 使用例子//創建一個FTP客戶端 FtpClient client = new FtpClient(“123.123.123.123”);
//如果您沒有指定登錄的憑證,我們將使用“匿名”用戶賬戶 client.Credentials = new NetworkCredential(“david”,”pass123”);
//開始連接到服務器 client.Connect();
//獲得一個在“/htdocs”目錄下的文件和文件夾的列表 foreach(FtpListItem item in client.GetListing(“/htdocs”)){ //如果這個是一個文件 if(item.Type == FtpFileSystemObjectType.File){ //獲得這個文件的大小 long size = client.GetFileSize(item.FullName); }
//獲得文件或者文件夾的修改日期和時間 DateTime time = client.GetModifiedTime(item.FullName);
//計算文件在服務器端的哈希值(默認的算法) FtpHash hash = client.GetHash(item.FullName); }
//上傳一個文件 client.UploadFile(@”C:\MyVideo.mp4”,”/htdocs/MyVideo.mp4”);
//重命名這個上傳的文件 client.Rename(“/htdocs/MyVideo.mp4”,”/htdocs/MyVideo_2.mp4”);
//下載這個文件 client.DownloadFile(@”C:\MyVideo_2.mp4”,”/htdocs/MyVideo_2.mp4”);
//刪除文件 client.deleteFile(“/htdocs/MyVideo_2.mp4”);
//遞歸地刪除一個文件夾 client.deleteDirectory(“/htdocs/extras/”);
//檢查文件是不是存在 if(client.FileExists(“/htdocs/big2.txt”)){}
//檢查一個文件夾是不是存在 if(client.DirectoryExists(“/htdocs/extras/”)){}
//上傳一個文件,并且如果失敗,在失敗之前會重新嘗試三次 client.RetryAttempts=3;
client.UploadFile(@”C:\MyVideo.mp4”,”/htdocs/big.txt”,FtpExists.Overwrite,false,FtpVerify.Retry);
//斷開連接!再見~ client.Disconnect(); Powershell你可以使用FluentFTP將文件從Powershell腳本傳輸到FTP服務器。開始:
>. C:\scripts\FluentFTP.ps1 #Makes functions callable from PowerShell scripts
> Show-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -FtpFileName "text*" > Rename-File -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -oldName "Readme.txt -newName Readme.done" > Send-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -fileName "Read*" > Get-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -ftpfileName "Read*" > Remove-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -ftpfileName "Read*" 在Powershell中運行以下命令可以打印出每個命令的幫助: > get-help -full Show-FtpFile > get-help -full Rename-FtpFile > get-help -full Send-FtpFile > get-help -full Get-FtpFile > get-help -full Remove-FtpFile 文檔
常見問題注:檢查這些常見問題和已經解決的常見問題。 日志相關的常見問題
連接相關的常見問題
文件傳輸的常見問題
文件管理的常見問題
Misc的常見問題
一些非常常見的問題
常見問題
APIFtpClient類的全部的API文檔都是用來處理所有的FTP/FTPS功能。 注:所有的方法都支持同步和異步的版本。只需在.NET 4.5+的版本中,為Async/await語的添加“Async”后綴,或者在.NET 4.0及以下版本的方法中添加“Begin”/“End”的前綴。 連接
服務器
目錄清單
文件傳輸 高級API:
低級API:
文件管理 工作目錄(相對的路徑相對于當前的工作目錄):
目錄:
文件:
文件權限 大多數的服務器支持的標準命令
只支持安裝并啟用了CHMOD擴展的UNIX FTP服務器
文件哈希 (筆記:高級的文件傳輸API支持在上傳/下載之后自動進行文件哈希) 大多數的服務器支持的標準命令
僅由某些服務器支持的非標準的命令。查看更多
工具 請導入FluentFTP來使用這些擴展方法,或者直接在FtpExtensions類中訪問它們。
請直接訪問FtpClient類下的這些靜態方法。
日志 有關日志和調試的幫助,請參閱FAQ的條目。
僅.NET Standard可用
僅.NET Framework可用
設置 FTP設置 可以自動檢測服務器上的FTP連接設置。
主動的FTP設置
FPTS設置 請在調用Connect()之前設置這些配置。可以自動地檢測這些工作在你服務器上的FTPS連接設置。
文件清單列表設置
文件傳輸設置
超時設置
嵌套字(socket)設置
FTP支持映射表記錄了支持的FTP命令和相應的API.. 連接指令
文件管理命令
文件哈希命令
常見問題如何自動檢測正確的鏈接設置?使用下面的代碼: FtpClient client = new FtpClient(hostname, username, password);//或者設置Host和Credentials var profiles = client.AutoDetect(); //如果找到任何配置文件,將代碼打印到控制臺 if(profiles.Count > 0){ var code = profiles[0].ToCode(); Console.WriteLine(code); } 一旦你找一個工作連接配置文件后,使用生成的代碼快速連接到你的FTP服務器。 如何自動連接到FTP或FTPS服務器?使用下面的代碼: FtpClient client = new FtpClient(hostname, username, password);//或者設置Host和Credentials client.AutoConnect(); 如何連接SSL/TLS?/如何使用FTPS?使用下面的代碼: FtpClient client = new FtpClient(hostname, username, password);//或者設置Host和Credentials client.EncryptionMode = FtpEncryptionMode.Explicit; client.SslProtocols = SslProtocols.Tls; client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate); client.Connect(); void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e){ //在這里添加邏輯以測試證書是否有效 e.Accept = true; } 如果你連接到服務器有任何的問題,嘗試使用其中之一: 讓操作系統選擇最高和最相關的TLS協議。 client.SslProtocols = Security.Authentication.SslProtocols.None; 防止操作系統使用在.NET Framework中有問題的TLS 1.0。 client.SslProtocols = SslProtocols.Default | SslProtocols.Tls11 | SslProtocols.Tls12; 如果你在Linux上使用并且使用SSL/TLS連接失敗,很可能是這個問題。 如何在使用FTPS時驗證服務器的證書?方法一:如果SSL證書沒有錯誤則進行連接。 cleint.ValidanteCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidtionEventArgs e){ if(e.PolicyErrors != System.Net.Security.SslPolicyErrors.None) { e.Accept = false; } else { e.Accept = true; } }); 方法二:如果證書與白名單證書匹配,則連接。 首先,您必須發現有效證書的字符串。使用此代碼將有效的證書字符串保存到文件中: cleint.ValidanteCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidtionEventArgs e){ File.WrtieAllText(@”c:\cert.txt”, e.Certificate.GetRawCertDataString()); }); 最后,使用這個代碼檢查收到的證書是否與您信任的證書匹配: string ValidCert = “<insert contents of cert.txt>”; cleint.ValidanteCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidtionEventArgs e){ if(e.PolicyErrors == SslPolicyErrors.None || e.Certificate.GetRawCertDataString() == ValidCert){ e.Accept = true; } else { Throw new Exception(“Invalid certificate : ” + e.PolicyErrors); } }); 如何使用SSL/TLS連接到Azure?假設您在Azure應用程序服務實例上使用FTP發布服務。 如果您在連接Azure時遇到問題,請確保您沒有“只使用FTPS”。根據Azure文檔,“僅支持FTPS”不支持TLS 1.0和1.1,這可能會在試圖將FluentFTP用于較舊版本的Windows時破壞連接。因此,當您試圖連接到一個將會阻塞TLS 1.1的Azure FTP實例時,連接將靜默地失敗,因為它只接受TLS 1.2。 將設置更改為允許不安全的FTP之后,可以使用顯式和隱式SSL模式連接FTPS。 如何連接FTPS,然后切換回純文本(Plaintext)的FTP?當你有一個FTP防火墻需要使用初文明的FTP的時候這是非常有用的。我們使用CCC命令指示服務器恢復到FTP。 在調用FtpClient類上的Connect()或任何其他方法之前設置此選項。 client.PlainTextEncryption = true; 如何連接SFTP?SFTP不被支持,因為它是SSH下的FTP,一個完全不一樣的協議。請使用SSH.NET。 如何中使用匿名的FTP賬戶登錄?/我在登錄的時候遇到錯誤但是我可以在Firefox/Filezilla中正常登錄不設置Credentials屬性,我們可以用匿名的身份登錄。或者您可以手動指定以下內容: client.Credentials = new NetworkCredential("anonymous", "anonymous"); 如何使用FTP代理登錄?創建一個FtpClientHttpProxy或者FtpClientUserAtHostProxy的對象實例,然后按照往常一樣使用FTP的屬性和方法。 如何追蹤文件的傳輸進度?所有的高級的方法都提供了一個progress的參數,被使用來跟蹤上傳或者下載的進度。 在使用之前,先創建一個回調的方法來提供給上傳/下載的方法。它將隨著FtpProgress對象被調用,其中包含傳輸的百分比和各種統計數據。 如果你創建在你WinForm程序的UI中,可以創建一個Minimum = 0并且Maximum = 100的ProgressBar。 使用異步的API: //接受一個FtpProgress對象的回調方法 Progress<FtpProgress> progress = new Progress<FtpProgress>(x => { //當進度未知的時候,會收到-1 if(x.Progress < 0) { progressBar.IsIndeterminate = true; } else { progressBar.IsIndeterminate = false; progressBar.Value = x; } }); 使用同步的API: //接受一個FtpProgress對象的回調方法 Action<FtpProgress> progress = new Action<FtpProgress>(x => { //當進度未知的時候,會收到-1 if(x.Progress < 0) { progressBar.IsIndeterminate = true; } else { progressBar.IsIndeterminate = false; progressBar.Value = x; } }); 現在要調用上傳/下載方法并提供您剛才創建的新的progress對象。 使用異步的方式: await client.DownloadFileAsync(localPath, remotePath, FtpLocalExists.Overwrite, FluentFTP.FtpVerify.Retry, progress); 使用同步的方式: client.DownloadFile(localPath, remotePath, FtpLocalExists.Overwrite, FluentFTP.FtpVerify.Retry, progress); 對于.NET 2.0的用戶,通過IProgress類來實現。你傳遞的對象的Report()方法將會攜帶進度的值被調用。 如何上傳動態創建的數據?使用Upload()來上傳一個stream或者byte[]。 如何下載數據而不將其保存到磁盤?使用Download()將數據下載到一個stream或者byte[]中。 如何繼續下載一個文件?使用帶有existsMode設置為FtpLocalExists.Append的DownloadFile()或者DownloadFiles()。 //通過比較文件大小和本地文件的大小,只下載文件中缺少的部分 client.DownloadFile(@”C:\MyVideo.mp4”, “/htdocs/MyVideo.mp4”, FtpLocalExists.Append); 其他的配置:
如何繼續上傳一個文件?使用一個新的API UploadFile(): //通過比較文件大小和本地文件的大小,只上傳服務器文件中缺少的部分 client.UploadFile(@”C:\bigfile.iso”, “/htdocs/bigfile.iso”, FtpLocalExists.Append); 如何控制上傳和下載的速度?設置UploadRateLimit和DownloadRateLimit屬性來控制數據傳輸的速度。只有高級API才支持同步和異步版本,比如:
有關節流的最新改進,請參閱這篇文章。 如何驗證文件的哈希值/校驗和,如果校驗和不匹配,如何重試?將FtpVerify選項設置添加到UploadFile()或DownloadFile()以啟用自動校驗和驗證。 //上傳文件的時候重新嘗試設置為3次 client.RetryAttempts = 3; //上傳一個文件,在放棄之前或嘗試重傳3次 client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/MyVideo.mp4", FtpExists.Overwrite, false, FtpVerify.Retry); 所有可能的配置:
如何追加到一個文件?使用API Upload(): //將數據追加到一個已經存在的文件中 File.AppendAllText(@"C:\readme.txt", "text to be appended" + Environment.NewLine); //只有readme.txt的新部分將被寫入服務器 client.UploadFile("C:\readme.txt", "/htdocs/readme.txt", FtpExists.Append); 使用基于流的API OpenAppend(): using (FtpClient conn = new FtpClient()) { conn.Host = "localhost"; conn.Credentials = new NetworkCredential("ftptest", "ftptest"); using (Stream ostream = conn.OpenAppend("/full/or/relative/path/to/file")) { try { ostream.Position = ostream.Length; var sr = new StreamWriter(ostream); sr.WriteLine(...); } finally { ostream.Close(); conn.GetReply(); //從服務器讀取成功/失敗響應 } } } 如何使用低級的(low-level)API下載文件?使用API OpenRead(): //創建遠程FTP流和本地文件流 using (var remoteFileStream = client.OpenRead(remotePath, FtpDataType.Binary)){ using (var newFileStream = File.create(localPath)){ //一次讀取8KB的數據(你可以增加數量) byte[] buffer = new byte[8 * 1024]; //下載文件到本地的流 int len; while ((len = remoteFileStream.Read(buffer, 0, buffer.Length)) > 0) { newFileStream.Write(buffer, 0, len); } } } //讀取FTP響應并防止套接字上的過時數據 client.GetReply(); 如果我的服務器不支持UTF-8,如何上傳/下載Unicode文件名的文件?手動設置連接編碼,以確保特殊字符正常工作。 默認你應該使用的代碼頁(codepage)是1252 Windows Western。它支持英語+歐洲字符(重音字符)。 client.Encoding = System.Text.Encoding.GetEncoding(1252); //ANSI代碼頁1252(Windows Western) 以下是基于你需要的字符集的代碼頁的完整列表:
GetListing()如何在內部工作?
如果這些都不能滿足你,你還可以退一步使用名稱清單列表(NLST命令),它比LIST和MLSD命令要慢很多。這是因為NLST只發送文件名列表,沒有任何屬性。必須逐個文件地查詢服務器的文件大小、修改日期和類型(文件/文件夾)。通過FtpListOption.ForceNameList標志,可以讓名稱清單列表可以被強制使用。 筆記:一些FTP服務器在列空文件夾的列表清單的時候不返回應答,所以客戶端在另一端將沒有與服務器溝通的套接字。這些異常在內部被捕獲,并返回一個空的文件列表。如果你需要檢查這個的捕獲的實現,請在FluentFTP項目中搜索FtpMissingSocketException的所有實例。 GetListing()如何返回一個遞歸的文件列表?在就版本的FluentFTP中,我們假定所有的服務器都支持通過List -R命令來遞歸列出文件的列表清單。然而,這導致了各種FTP服務器布置成遞歸列出清單的許多的問題:GetListing()調用將簡單地返回第一個目錄的內容,而不包含任何子目錄。 因此,自從20.0.0版本,我們嘗試去檢查FTP服務器的軟件,并且如果我們確定它不支持遞歸列表,我們將自己動手地進行遞歸。我們開始先假設所有服務器都不支持遞歸列表,然后將特定的服務器類型列入白名單。 如果您感覺GetListing()在使用遞歸列出列表清單的時候速度太慢,并且您知道您的FTP服務器支持LIST -R命令,然后請為您的服務器提供支持:
支持哪種散列命令?我們支持XCRC、XMD5和XSHA,它們是非標準命令,不包含任何形式的規范。它們不能保證工作,強烈建議您檢查FtpClient。在調用這些方法之前,為各自的標志設置功能標志(XCRC、XMD5、XSHA1、XSHA256、XSHA512)。 這里文章中描述的MD5命令支持也已經被添加。在執行命令之前,再次檢查FtpFeature.MD5。 對HASH命令的支持已經添加到FluentFTP中。它支持從支持這個功能的服務器上檢索SHA-1、SHA-256、SHA-512和MD5散列。返回的FtpHash對象,它有一個具有針對給定流或本地文件檢查結果的方法。你可以在這個草案中了解更多關于HASH的信息。 如何在調試時追蹤FTP命令?在程序啟動時執行此操作(因為它是靜態的,所以對所有FtpClient實例都有效)。 .NET Framework版本 FtpTrace.AddListener(new ConsoleTraceListener()); FtpTrace.LogUserName = false;//隱藏FTP用戶名 FtpTrace.LogPassword = false;//隱藏FTP密碼 FtpTrace.LogIP = false; //隱藏FTP的IP地址 .NET Standard版本 FtpTrace.LogToConsole = true; FtpTrace.LogUserName = false;//隱藏FTP用戶名 FtpTrace.LogPassword = false;//隱藏FTP密碼 FtpTrace.LogIP = false;//隱藏FTP的IP地址 如何在調試記錄所有的FTP命令到文件中?在程序啟動時執行此操作(因為它是靜態的,所以對所有FtpClient實例都有效)。 .NET Framework版本 FtpTrace.AddListener(new TextWriterTraceListener("log_file.txt")); FtpTrace.LogUserName = false;//隱藏FTP用戶名 FtpTrace.LogPassword = false;//隱藏FTP密碼 FtpTrace.LogIP = false; //隱藏FTP的IP地址 .NET Standard版本 FtpTrace.LogToFile = “log_file.txt”; FtpTrace.LogUserName = false;//隱藏FTP用戶名 FtpTrace.LogPassword = false;//隱藏FTP密碼 FtpTrace.LogIP = false;//隱藏FTP的IP地址 如何將關鍵錯誤記錄到文件中?這是生產服務器的推薦配置。僅在.NET Framework版本中被支持。 在程序啟動時執行此操作(因為它是靜態的,所以對所有FtpClient實例都有效)。 FtpTrace.LogFunctions = false; FtpTrace.AddListener(new TextWriterTraceListener("log_file.txt"){ Filter = new EventTypeFilter(SourceLevels.Error) }); 如何禁用函數調用的日志記錄?在程序啟動時執行此操作(因為它是靜態的,所以對所有FtpClient實例都有效)。 FtpTrace.LogFunctions = false; 如何中日志中省略掉敏感的信息?使用這些設置來控制日志中包含哪些數據:
如何使用像NLog這樣的第三方日志記錄框架?FluentFTP有一個名為“FluentFTP”的內置TraceSource,可用于調試和日志記錄。目前,除了.NET Standard之外,所有的.NET Framework版本都可以使用。通過寫入到程序或者配置到你的app.config或者web.config都可以將實現任何的TraceListener附加到類庫程序中。這將允許直接日志記錄或轉發到第三方日志記錄框架。 大多數跟蹤消息的類型為Verbose或Information,通常可以忽略,除非進行調試。大多數被忽略的異常被歸類為Warning,但是返回布爾值表示成功/失敗的方法,將以Error級別記錄失敗原因。如果您使用的是.NET Standard,并且設置了DEDUG標志,然后所有日志消息將通過Debug.Write(message)方式發出。 在代碼中附加TraceListener: TraceListener console = ConsoleTraceListener() { Filter = new EventTypeFilter(SourceLevels.Verbose | SourceLevels.ActivityTracking) }; FtpTrace.AddListener(console); 通過配置文件附加: <system.diagnostics> <trace autoflush="true"></trace> <sources> <source name="FluentFTP"> <listeners> <clear /> <!--附加一個Console控制臺監聽器--> <add name="console" /> <!--附加一個File監聽器--> <add name="file" /> <!--附加一個用戶自定義的監聽器--> <add name="myLogger" /> <!--附加一個NLog監聽器--> <add name="nlog" /> </listeners> </source> </sources> <sharedListeners> <!--定義一個Console控制臺監聽器--> <add name="console" type="System.Diagnostics.ConsoleTraceListener" /> <!--定義一個File監聽器 --> <add name="file" type="System.Diagnostics.TextWriterTraceListener" initializeData="outputFile.log"> <!--只寫入錯誤--> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error" /> </add> <!--定義一個用戶自定義的監聽器--> <add name="custom" type="MyNamespace.MyCustomTraceListener /> <!--附加一個NLog監聽器--> <add name="nlog" type="NLog.NLogTraceListener, NLog" /> </sharedListeners> </system.diagnostics> EnableThreadSafeDataConnections做什么?EnableThreadSafeDataConnections是由最初的作者構建的一個較老的特性。如果為true,那么每當您試圖上傳/下載文件時,它都會打開一個新的FTP客戶端實例(并重新連接到服務器)。它曾經是默認設置,但它嚴重影響了性能,所以我禁用了它,發現許多問題都得到了解決,性能也得到了恢復。我相信如果開發者想要多線程上傳,他們應該啟動一個新的BackgroundWorker并在該線程中創建/使用FtpClient。如果你想要并發上傳,可以嘗試一下。 如何對FluentFTP做一些修改?/如何提交一個拉取請求(a pull reqest)?首先你必須“fork”FluentFTP,然后對本地版本進行更改,當提交“pull request”請求讓我合并你的變化。
如何檢測正在連接的服務器的類型?您可以讀取ServerType來獲得您所連接的FTP服務器軟件的確切類型。我們動態根據我們接連到服務器時服務器所發送的歡迎信息(the welcome message),來檢測FTP服務器軟件。我們目前可以檢測如下軟件類型:
您還可以讀取ServerOS來獲得所連接的FTP服務器的操作系統。我們可以檢測如下系統到:
如何使用客戶端證書登入FTPS?添加你的證書到ClientCertificates,然后再調用Connect()。 client.EncryptionMode = FtpEncryptionMode.Explicit; client.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12; client.SocketKeepAlive = false; client.ClientCertificates.Add(new X509Certificate2("C:\mycert.cer")); client.ValidateCertificate += (control, e) => { e.Accept = e.PolicyErrors == SslPolicyErrors.None; }; client.Connect(); 并確保:
如何從一個文件捆綁X509證書?您需要將證書添加到本地存儲(local store),然后執行以下操作: FluentFTP.FtpClient client = new FluentFTP.FtpClient("WWW.MYSITE.COM", "USER","PASS"); //選擇證書并將它添加到客戶端 X509Store store = new X509Store("MY", StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false); X509Certificate2Collection scollection = X509Certificate2UI.selectfromCollection(fcollection, "select a certificate", "select a certificate", X509selectionFlag.Multiselection); if (scollection.Count != 1) { throw new Exception("Error: You have not chosen exactly one certificate"); } foreach (X509Certificate2 x509 in scollection) { client.ClientCertificates.Add(x509); } store.Close(); //client.ReadTimeout = 10000; client.Connect(); 這是另外一種方式。使用X509Certificate2。我一直無法讓X509Certificate證書工作,從我的查閱的資料來看,這是因為它是一個不完整的實現。 public void InitSFTP() { FluentFTP.FtpClient client = new FluentFTP.FtpClient("WWW.MYSITE.COM", "USER", "PASS"); X509Certificate2 cert_grt = new X509Certificate2("C:\mycert.xyz"); client.EncryptionMode = FtpEncryptionMode.Explicit; client.DataConnectionType = FtpDataConnectionType.PASV; client.DataConnectionEncryption = true; client.ClientCertificates.Add(cert_grt); client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate); client.Connect(); } private void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e) { e.Accept = true; } 解決問題在Visual Studio 2010中Fluent安裝失敗:“System.Runtime”已經為“FluentFTP”定義了一個依賴項你的VS使用了一個老版本的nuget.exe,所以它不能正確安裝最新的FluentFTP。你必須下載nuget.exe 并手動執行下面這些命令: cd D:\Projects\MyProjectDir C:\Nuget\nuget.exe install FluentFTP 上傳一個帶有特殊字符的文件,像是“Caffè.png”,在FTP服務器上,它表現為“Caff?.png”。這個服務器只支持ASCII,但是這個“è”是ASCII。FileZilla可以上傳這個文件,并且沒有任何問題手動設置連接編碼,以確保特殊字符正常工作。 默認你應該使用的代碼頁(codepage)是1252 Windows Western。它支持英語+歐洲字符(重音字符)。 client.Encoding = System.Text.Encoding.GetEncoding(1252); //ANSI代碼頁1252(Windows Western) 如何文件名中含有俄文字母,我無法刪除這個文件。但是FileZilla可以刪除這個文件,并且沒有問題手動設置連接編碼,以確保特殊字符正常工作。 對于俄語,你需要使用代碼頁1251 Windows Cyrillic client.Encoding = System.Text.Encoding.GetEncoding(1251); //ANSI代碼頁1251(Windows Cyrillic) 我總是在我的Azure WebApp中發生TimeoutException異常首先嘗試減少Azure需要的套接字輪詢間隔。 client.SocketPollInterval = 1000; 如果這也不管用,那么試著減少超時時間。 client.SocketPollInterval = 1000; client.ConnectTimeout = 2000; client.ReadTimeout = 2000; client.DataConnectionConnectTimeout = 2000; client.DataConnectionReadTimeout = 2000; 如果這些都不起作用,請記住Azure有一個間歇性的bug,在這個bug中,它會在FTP請求期間更改ip地址。連接是使用IP地址A建立的,Azure使用IP地址B進行數據傳輸,這在很多防火墻上是不允許的。這是一個已知的Azure bug。 許多的命令無法在Windows CE上正常工作根據MSDN上所說的,Windows CE上的FTP實現是最少的,并通過源代碼開放定制。許多高級命令如CHMOD都不受支持。 使用OpenWrite/OpenAppend成功傳輸單個文件后,后續文件失敗,出現一些隨機錯誤,如“格式錯誤的PASV響應”您需要在傳輸完文件之后調用FtpReply status = GetReply(),以確保沒有遺留過時的數據,以免打亂后續命令。 在FTPS的登入期間,SSL協商非常緩慢FluentFTP在.NET Framework的底層使用SslStream。SslStream使用一個windows的特性功能來動態地更新Root CA證書,這可能會導致證書認證過程中的長時間延遲。這可能會在FluentFTP中引起與SocketPollInterval屬性相關的問題,該屬性用于檢查客戶機和服務器之間的不合理斷開連接。這個MSDN博客討論了SslStream的問題,并討論了如何禁用Root CA證書的自動更新。 FluentFTP記錄認證所需的時間。如果您認為自己正遭受這個問題的困擾,那么請查看Examples\ debug .cs以獲取有關檢索調試信息的信息。 無法從傳輸連接讀取數據:遠程主機強制關閉了現有連接這意味著服務器上的 [FTP守護進程(FTP daemon)] 服務沒有運行(可能不是這種情況),或者服務當前仍然忙于執行另一個操作。這聽起來就像服務器返回一條消息,表明它仍然在執行上一個操作。 嘗試減少輪詢間隔以確保連接不會超時。 client.SocketPollInterval = 1000; 該文章在 2023/10/9 9:50:00 編輯過 |
關鍵字查詢
相關文章
正在查詢... |