欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

 項(xiàng)目中經(jīng)常涉及到將文件批量上傳到其它空間或服務(wù)器,這個(gè)時(shí)候我們有可能需要用到FTP協(xié)議進(jìn)行傳輸,所以這里我推薦使用FluentFTP,一款很好用的FTP傳輸框架。

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

  Nuget安裝一下:

?PM> Install-Package FluentFTP

  首先第一步,new一個(gè)Client:

1 /*
2 第一個(gè)參數(shù)是FTP地址,注意要加協(xié)議名
3 第二個(gè)參數(shù)是端口,默認(rèn)21
4 第三個(gè)參數(shù)是FTP用戶名
5 第四個(gè)參數(shù)是FTP密碼
6 正常情況下配置三個(gè)屬性即可,大家按需選擇:
7 EncryptionMode是指定加密方式,這里我選擇None不加密,
8 DataConnectionType是連接方式,一般都是選PASV被動(dòng)模式或PORT主動(dòng)模式,根據(jù)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是否與遠(yuǎn)程服務(wù)建立了連接
2 if (!ftpClient.IsConnected)
3 {
4     //發(fā)起連接登錄
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 }

   這里有一個(gè)比較坑的地方,特別是不了解FTP的伙伴,甚至?xí)m結(jié)半天,那就是文件如果是中文文件名,上傳后文件名會(huì)變成亂碼。原因是因?yàn)橛幸恍〧TPServer默認(rèn)是不開啟UTF8編碼傳輸,甚至不支持UTF8編碼傳輸,這個(gè)時(shí)候需要我們手動(dòng)開啟一下,F(xiàn)TP命令是OPTS UTF8 ON

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

  這個(gè)時(shí)候FTPServer會(huì)返回一個(gè)狀態(tài)碼,200表示開啟成功;202是always enable,表示FTPServer會(huì)一直處于開啟UTF-8編碼的狀態(tài),不需要手動(dòng)開啟。

  但除此之外,還有剛才提到的,F(xiàn)TPServer本身不支持UTF8編碼的傳輸,這個(gè)時(shí)候我們需要將之前的Encoding設(shè)置為ISO-8859-1即可:

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

   第三步,上傳文件:

1 /// <summary>
2 /// 上傳單個(gè)文件
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(),可以直接上傳整個(gè)文件夾。

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

  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種模式:更新和鏡像。 在任何模式下,遠(yuǎn)程目錄都會(huì)完整列出,然后進(jìn)行比較,然后開始實(shí)際的上載。 這樣做是為了跳過已經(jīng)上傳的文件。 我們可以支持第三種模式,例如BlindTransfer,它不會(huì)列出遠(yuǎn)程目錄。

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

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

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

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

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();
//獲取列表的詳細(xì)信息
ftpClient.GetListingAsync();

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

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

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


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