在附件管理模塊中增加對FTP 上傳和預覽的支持

来源:http://www.cnblogs.com/wuhuacong/archive/2017/06/07/6956419.html
-Advertisement-
Play Games

在之前介紹的附件管理模塊裡面《Winform開發框架之通用附件管理模塊》以及《Winform開發框架之附件管理應用》,介紹了附件的管理功能,通過對資料庫記錄的處理和文件的管理,實現了附件文件和記錄的整合管理,可以運用在單機版的WInform框架,也可以使用在分散式的混合式開發框架中,隨著一些開發場景... ...


在之前介紹的附件管理模塊裡面《Winform開發框架之通用附件管理模塊》以及《Winform開發框架之附件管理應用》,介紹了附件的管理功能,通過對資料庫記錄的處理和文件的管理,實現了附件文件和記錄的整合管理,可以運用在單機版的WInform框架,也可以使用在分散式的混合式開發框架中,隨著一些開發場景的豐富,我們需要以FTP方式上傳文件,因此對這個附件管理模塊進行擴展,以便適合更多的實際項目需求。

1、FTP上傳、HTTP文件預覽實現思路

我們設想的附件管理,底層都是需要在Winform、Web等開發項目上重用的,因此底層的設計需要考慮好對應的處理,另外後面可以利用WInform的HTML編輯控制項、或者Web的HTML編輯控制項進行集成,附件則是統一在一個組件裡面實現的。

藉助FTP的文件上傳,我們單機版本或者基於區域網的Winform界面程式,也可以單獨構建一個FTP伺服器,實現文件的共用;而分散式的混合式開發框架中,對於文件的上傳,可以選擇基於服務的文件系統寫入,同時也可以基於FTP的方式上傳。

基於混合式框架的FTP方式上傳文件,其邏輯關係如下所示。

 

這樣文件通過FTP方式上傳的文件系統後,我們在文件系統裡面搭建一個HTTP服務,這樣對應上的HTTP地址就可以實現文件的下載,以及圖片的查看等操作了(可以在HTML編輯器中實現)。

 

2、引入FTP組件實現文件上傳

 使用FTP上傳,雖然在自己的公用類庫裡面有FTPHelper類可以使用,不過相對來說,我更願意引入更為完善強大的FTP開源組件進行相關的處理,這裡我們使用FluentFTP這個組件(GitHub地址:https://github.com/hgupta9/FluentFTP ),這個是一個應用很廣,功能很強大的FTP組件。

FluentFTP是一款老外開發的基於.Net的支持FTP及的FTPS 的FTP類庫,FluentFTP是完全托管的FTP客戶端,被設計為易於使用和易於擴展。它支持文件和目錄列表,上傳和下載文件和SSL / TLS連接。它可以連接到Unix和Windows IIS建立FTP伺服器。這個項目是完全開發托管C #。

這個組件的使用代碼,這裡粘貼一下,以便總體有一個直觀的瞭解吧。

// create an FTP client
FtpClient client = new FtpClient("123.123.123.123");

// if you don't specify login credentials, we use the "anonymous" user account
client.Credentials = new NetworkCredential("david", "pass123");

// begin connecting to the server
client.Connect();

// get a list of files and directories in the "/htdocs" folder
foreach (FtpListItem item in client.GetListing("/htdocs")) {
    
    // if this is a file
    if (item.Type == FtpFileSystemObjectType.File){
        
        // get the file size
        long size = client.GetFileSize(item.FullName);
        
    }
    
    // get modified date/time of the file or folder
    DateTime time = client.GetModifiedTime(item.FullName);
    
    // calculate a hash for the file on the server side (default algorithm)
    FtpHash hash = client.GetHash(item.FullName);
    
}

// upload a file
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt");

// rename the uploaded file
client.Rename("/htdocs/big.txt", "/htdocs/big2.txt");

// download the file again
client.DownloadFile(@"C:\MyVideo_2.mp4", "/htdocs/big2.txt");

// delete the file
client.DeleteFile("/htdocs/big2.txt");

// delete a folder recursively
client.DeleteDirectory("/htdocs/extras/");

// check if a file exists
if (client.FileExists("/htdocs/big2.txt")){ }

// check if a folder exists
if (client.DirectoryExists("/htdocs/extras/")){ }

// upload a file and retry 3 times before giving up
client.RetryAttempts = 3;
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt", FtpExists.Overwrite, false, FtpVerify.Retry);

// disconnect! good bye!
client.Disconnect();

有了這些瞭解,我們在普通Winform程式或者混合式框架的的程式中,我們通過配置指定FTP的相關信息,就可以在代碼裡面載入這些信息,進行FTP的登陸、文件上傳、下載等操作了。

 

3、附件管理模塊實現

有了上面的思路和組件的輔助,我們對原來的附件管理模塊進行相關的升級處理即可實現FTP上傳模式的處理了。

首先為了方便,我們先定義一個獲取FTP伺服器、用戶名、密碼等參數的配置實體類,如下所示。

    /// <summary>
    /// FTP配置信息
    /// </summary>
    [DataContract]
    [Serializable]
    public class FTPInfo
    {
        /// <summary>
        /// 預設構造函數
        /// </summary>
        public FTPInfo()
        {

        }

        /// <summary>
        /// 參數化構造函數
        /// </summary>
        /// <param name="server"></param>
        /// <param name="user"></param>
        /// <param name="password"></param>
        public FTPInfo(string server, string user, string password, string baseUrl)
        {
            this.Server = server;
            this.User = user;
            this.Password = password;
            this.BaseUrl = baseUrl;
        }

        /// <summary>
        /// FTP服務地址
        /// </summary>
        [DataMember]
        public string Server { get; set; }

        /// <summary>
        /// FTP用戶名
        /// </summary>
        [DataMember]
        public string User { get; set; }

        /// <summary>
        /// FTP密碼
        /// </summary>
        [DataMember]
        public string Password { get; set; }

        /// <summary>
        /// FTP的基礎路徑,如可以指定為IIS的路徑:http://www.iqidi.com:8000 ,方便下載打開
        /// </summary>
        [DataMember]
        public string BaseUrl { get; set; }
    }

定義一個函數,專門用來提取配置文件裡面的相關FTP參數的,如下所示。

        /// <summary>
        /// 獲取配置的FTP配置參數
        /// </summary>
        /// <returns></returns>
        private FTPInfo GetFTPConfig()
        {
            var ftp_server = config.AppConfigGet("ftp_server");
            var ftp_user = config.AppConfigGet("ftp_user");
            var ftp_pass = config.AppConfigGet("ftp_password");
            var ftp_baseurl = config.AppConfigGet("ftp_baseurl");

            return new FTPInfo(ftp_server, ftp_user, ftp_pass, ftp_baseurl);
        }

其中我們的配置文件如下所示。

使用FluentFTP的組件代碼如下所示。

//使用FluentFTP操作FTP文件
FtpClient client = new FtpClient(ftpInfo.Server, ftpInfo.User, ftpInfo.Password);

然後調用FTP組件對目錄進行判斷,無則創建一個即可。

//確定日期時間目錄(格式:yyyy-MM),不存在則創建
string savePath = string.Format("/{0}-{1:D2}/{2}", DateTime.Now.Year, DateTime.Now.Month, category);
bool isExistDir = client.DirectoryExists(savePath);
if(!isExistDir)
{
    client.CreateDirectory(savePath);
}

最後使用組件上傳文件即可,這裡上傳文件,由於前面FileUploadInfo實體類裡面存儲的是位元組數組,因此也是採用FTP組件直接上傳位元組數組即可。

//使用FTP上傳文件
//避免文件重覆,使用GUID命名
var ext = FileUtil.GetExtension(info.FileName);
var newFileName = string.Format("{0}{1}", Guid.NewGuid().ToString(), ext);//FileUtil.GetFileName(file);

savePath = savePath.UriCombine(newFileName);
bool uploaded = client.Upload(info.FileData, savePath, FtpExists.Overwrite, true);

文件上傳到文件伺服器後,剩下的就是把相關的信息存儲到附件管理模塊的數據表裡面即可,這樣可以在使用的時候,直接使用資料庫裡面的信息,如果是需要查看圖片或者下載文件,那麼拼接好相關的HTTP地址即可,我們來看看對應的資料庫記錄截圖如下所示。

有了這些基礎信息,我們可以同時改造我之前介紹過的Winform之HTML編輯控制項:ZetaHtmlEditControl了(分享一個Winform裡面的HTML編輯控制項Zeta HTML Edit Control,漢化附源碼),我對這個控制項所有英文的菜單、工具欄、對話框、提示內容等資源進行中文化後,併在工具欄中增加插入圖片、列印功能後,界面如下所示。

預設情況下,我們加入圖片的方式,肯定還是基於本地文件的方式了;但是經過我們改造使用FTP上傳文件方式後,在控制項上獲得HTTP地址,就可以對圖片文件進行預覽展示的操作了。

這種方法構造的圖片地址,屬於標準的URL地址,可以在各個地方進行查看的,如下界面所示。

這個就是ZetaHtmlEditControl控制項,整合我們前面已經完成了FTP上傳模式的附件管理模塊,實現編輯線上HTML的功能,這樣的HTML內容,同樣可以適合在Web界面下的HTML編輯器上進行展示了。

以上就是我為整個WInform開發框架構造的項目組件,增加的FTP上傳方式,同時完善了對應的場景需求,在ZetaHtmlEditControl控制項上實現編輯線上HTML的功能,希望開發的思路對您有所增益。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 中間實在忙啊,隔了幾天,終於有點時間,本來以為寫博客很簡單,不過現在感覺怎麼把意思表達清楚真是件難事啊,所以,寫的不好,園友們不要介意啊。 話說,上回我打算開發游戲,考慮了4種技術,後來我發現無論哪種技術應該是都能實現,區別大概就是性能以及占用的資源吧,所以,我後來實現用的是wpf。當時在網上搜索了 ...
  • 一. es安裝相關1.elasticsearch安裝 運行http://localhost:9200/2.head插件3.bigdesk插件安裝(安裝細節百度:windows elasticsearch 安裝,有詳細內容) 二. es插件相關http://www.searchtech.pro/ela ...
  • 環境:界面上有TextBox,ComboBox等控制項。 不建議把左右方向鍵都用來切換焦點,否則你在TextBox裡面改變游標所在字元位置就不方便了。 方法一:笨方法,需為每個控制項單獨註冊事件處理 以TextBox為例,代碼如下: 方法二:通用方法,無需為每個控制項單獨註冊事件處理,僅需在窗體類上加入如 ...
  • 凡是契約類或者繼承了契約類的類,如果想要屬性參與序列化與反序列化,需要在屬性上加上標記:DataMember ...
  • 最近幫朋友做個項目中遇到了type=file change事件只能執行一次的問題,度娘了一下,發現提供了各種解決方案,所以決定記錄一下我的思考方向和最終解決方式。 起初幫朋友做個項目,項目中遇到上傳文件,沒想太多,代碼就敲了起來,尼瑪,上傳做好啦,興衝衝,一測,ei,怎麼回事,怎麼不能上傳了,程式員 ...
  • 只要JSON字元串是一個對象,當我們直接反序列化遇到,字元串中的部分屬性值不符合要求時,我們可以先將對象轉為:JObject,對對象屬性修正後,再使用JObject提供的ToObject ...
  • 因為項目需要在導出數據到EXECL文檔的同時還需要導出圖片進去,在處理是遇到的一些問題,在此記錄一下。 首先代碼寫好之後放測試伺服器上去執行的時候報錯了,報檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時失敗,原因是出現以 ...
  • 由於谷歌翻譯官方API是付費版本,本著免費和開源的精神,分享一下用C#實現谷歌翻譯API的代碼。這個代碼非常簡單,主要分兩塊:通過WebRequest的方式請求內容;獲取Get方式的請求參數(難點在於tk的獲取)。 一、WebRequest代碼 二、谷歌翻譯介面的實現 1、抓包查看翻譯網路請求,這裡 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...