如何在附件管理模組中增加對FTP 上傳和預覽的支援?

來源:互聯網
上載者:User
在之前介紹的附件管理模組裡面《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地址: ),這個是一個應用很廣,功能很強大的FTP組件。

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

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

// create an FTP clientFtpClient client = new FtpClient("123.123.123.123");// if you don't specify login credentials, we use the "anonymous" user accountclient.Credentials = new NetworkCredential("david", "pass123");// begin connecting to the serverclient.Connect();// get a list of files and directories in the "/htdocs" folderforeach (FtpListItem item in client.GetListing("/htdocs")) {    // if this is a fileif (item.Type == FtpFileSystemObjectType.File){        // get the file sizelong size = client.GetFileSize(item.FullName);            }    // get modified date/time of the file or folderDateTime 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 fileclient.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt");// rename the uploaded fileclient.Rename("/htdocs/big.txt", "/htdocs/big2.txt");// download the file againclient.DownloadFile(@"C:\MyVideo_2.mp4", "/htdocs/big2.txt");// delete the fileclient.DeleteFile("/htdocs/big2.txt");// delete a folder recursivelyclient.DeleteDirectory("/htdocs/extras/");// check if a file existsif (client.FileExists("/htdocs/big2.txt")){ }// check if a folder existsif (client.DirectoryExists("/htdocs/extras/")){ }// upload a file and retry 3 times before giving upclient.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的路徑::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編輯器上進行展示了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.