狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#.NET下好用的FTP框架FluentFTP避坑指南

admin
2023年10月9日 10:15 本文熱度 1079

 項目中經常涉及到將文件批量上傳到其它空間或服務器,這個時候我們有可能需要用到FTP協議進行傳輸,所以這里我推薦使用FluentFTP,一款很好用的FTP傳輸框架。

  github地址:https://github.com/robinrodricks/FluentFTP

  Nuget安裝一下:

?PM> Install-Package FluentFTP

  首先第一步,new一個Client:

1 /*
2 第一個參數是FTP地址,注意要加協議名
3 第二個參數是端口,默認21
4 第三個參數是FTP用戶名
5 第四個參數是FTP密碼
6 正常情況下配置三個屬性即可,大家按需選擇:
7 EncryptionMode是指定加密方式,這里我選擇None不加密,
8 DataConnectionType是連接方式,一般都是選PASV被動模式或PORT主動模式,根據FTPServer情況修改
9 Encoding是指定編碼
10 */
11 var ftpClient = new FtpClient($"ftp://{host}", port, userName, passWord)
12 {
13     EncryptionMode = FtpEncryptionMode.None,
14     DataConnectionType = FtpDataConnectionType.PASV,
15     Encoding = Encoding.UTF8
16 };

   接下來第二步,登錄FTP:

1 //IsConnected是判斷client是否與遠程服務建立了連接
2 if (!ftpClient.IsConnected)
3 {
4     //發起連接登錄
5     await ftpClient.ConnectAsync();
6     //啟用UTF8傳輸
7     var result = ftpClient.execute("OPTS UTF8 ON");
8     if (!result.Code.Equals("200") && !result.Code.Equals("202"))
9         ftpClient.Encoding = Encoding.GetEncoding("ISO-8859-1");
10 }

   這里有一個比較坑的地方,特別是不了解FTP的伙伴,甚至會糾結半天,那就是文件如果是中文文件名,上傳后文件名會變成亂碼。原因是因為有一些FTPServer默認是不開啟UTF8編碼傳輸,甚至不支持UTF8編碼傳輸,這個時候需要我們手動開啟一下,FTP命令是OPTS UTF8 ON

1
ftpClient.execute("OPTS UTF8 ON");

  這個時候FTPServer會返回一個狀態碼,200表示開啟成功;202是always enable,表示FTPServer會一直處于開啟UTF-8編碼的狀態,不需要手動開啟。

  但除此之外,還有剛才提到的,FTPServer本身不支持UTF8編碼的傳輸,這個時候我們需要將之前的Encoding設置為ISO-8859-1即可:

1
ftpClient.Encoding = Encoding.GetEncoding("ISO-8859-1");

   第三步,上傳文件:

1 /// <summary>
2 /// 上傳單個文件
3 /// </summary>
4 /// <param name="sourcePath">文件源路徑</param>
5 /// <param name="destPath">上傳到指定的ftp文件夾路徑</param>
6 public async void UploadFile(string sourcePath, string destPath)
7 {
8      if (!File.Exists(sourcePath))
9          return;
10      var fileInfo = new FileInfo(sourcePath);
11      await ftpClient.UploadFileAsync(sourcePath, $"{destPath}/{fileInfo.Name}", createRemoteDir: true);
12 }

   如果想批量上傳文件,則使用ftpClient.UploadDirectoryAsync(),可以直接上傳整個文件夾。

        這里有個比較坑的地方是,如果FTPServer目錄下的文件特別多(注意:不是你上傳文件的數量),上傳所需的時間會特別長。在我查看了FTPServer日志后發現,在使用UploadDirectoryAsync()的時候,FluentFTP會先去獲取所有文件和文件夾的列表,在獲取完所有列表信息后,才開始上傳操作,非常浪費時間。在嘗試解決無果后,我去github上找了一下,作者的回復是:

  Currently we support 2 modes, update and mirror. In any mode, the remote directory is fully listed, then compared, then the actually upload begins. This is done in order to skip files that are already uploaded. We can support a third mode, maybe like BlindTransfer which will not list the remote directory.

  google翻譯:目前,我們支持2種模式:更新和鏡像。 在任何模式下,遠程目錄都會完整列出,然后進行比較,然后開始實際的上載。 這樣做是為了跳過已經上傳的文件。 我們可以支持第三種模式,例如BlindTransfer,它不會列出遠程目錄。

  但在目前最新版本33.0.3版本下,仍舊只支持Mirror和update兩種模式。

  Issues:https://github.com/robinrodricks/FluentFTP/issues/616

  所以,如果需要批量上傳,可以在單文件上傳的基礎上自己再做一層封裝,至于其它的下載、刪除、查看等功能,暫未發現其它的坑,環境.net core 3.1。

  這里舉幾個常用的方法,其余的不在這里贅述,大家看文檔和框架的注釋就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//下載文件
ftpClient.DownloadFileAsync();
//下載文件夾
ftpClient.DownloadDirectoryAsync();
//刪除文件
ftpClient.deleteFileAsync();
//刪除文件夾
ftpClient.deleteDirectoryAsync();
//判斷文件是否存在
ftpClient.FileExistsAsync();
//判斷文件夾是否存在
ftpClient.DirectoryExistsAsync();
//獲取列表的詳細信息
ftpClient.GetListingAsync();

   最后,記住登出、釋放資源:

1 if (ftpClient.IsConnected)
2 {
3     //關閉
4     await ftpClient.DisconnectAsync();
5    ftpClient.Dispose();
6 }

         FluentFTP除了上述的坑以外,功能還是非常齊全、強大的,提供了各種各樣的方法和配置,建議大家使用。


該文章在 2023/10/9 10:16:00 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved