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

在之前介紹的附件管理模塊里面《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的功能,希望開發的思路對您有所增益。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容