在头里介绍的附属类小部件处理模块里面《Winform开拓框架之通用附属类小部件管理模块》以及《Winform开辟框架之附属类小部件管理应用》,介绍了附属类小部件的管住功效,通过对数据库记录的管理和文书的治本,落成了附属类小部件文件和著录的整合管理,能够应用在单机版的WInform框架,也得以利用在遍及式的混合式开拓框架中,随着有个别耗费景况的丰盛,大家供给以FTP格局上传文件,由此对这些附属类小部件管理模块进行扩大,以便适合越来越多的实际项目须要。

一、FTP上传、HTTP文件预览实现思路

作者们着想的附件管理,底层都以索要在Winform、Web等支出项目上海重型机器厂用的,由此底层的安顿必要考虑好相应的管理,别的前边能够利用WInform的HTML编辑控件、恐怕Web的HTML编辑控件实行集成,附属类小部件则是联合在1个零件里面落成的。

借助FTP的文书上传,大家单机版本可能依照局域网的Winform分界面程序,也得以独立营造1个FTP服务器,实现公文的共享;而布满式的混合式开辟框架中,对于文本的上传,可以选拔基于服务的文件系统写入,同临时常候也足以依照FTP的措施上传。

依据混合式框架的FTP方式上传文件,其逻辑关系如下所示。

 图片 1

诸如此类文件通过FTP情势上传的文件系统后,大家在文件系统里面搭建3个HTTP服务,那样对应上的HTTP地址就能够兑现公文的下载,以及图片的查看等操作了(能够在HTML编辑器中落到实处)。

 

二、引进FTP组件达成公文上传

 使用FTP上传,纵然在团结的公用类Curry面有FTPHelper类能够利用,但是相对来讲,小编更乐于引进更为完善强大的FTP开源组件进行相关的拍卖,这里大家应用FluentFTP这一个组件(GitHub地址:
),这些是一个用到很广,功效很有力的FTP组件。

FluentFTP是1款老外开荒的基于.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的登入、文件上传、下载等操作了。

 

三、附属类小部件管理模块完结

有了上边的思路和组件的增派,我们对原本的附件处理模块进行有关的晋升管理就能够完毕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; }
    }

概念1个函数,特意用来提取配置文件之中的相干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);
        }

其间我们的布署文件如下所示。

图片 2

应用FluentFTP的零件代码如下所示。

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

接下来调用FTP组件对目录实行剖断,无则开创1个就能够。

//确定日期时间目录(格式: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);

文本上传到文件服务器后,剩下的就是把相关的音讯囤积到附属类小部件管理模块的数据表里面就可以,那样能够在利用的时候,直接行使数据Curry面包车型地铁音信,假如是内需查阅图片大概下载文件,那么拼接好相关的HTTP地址即可,大家来看望对应的数据库记录截图如下所示。

图片 3

有了这个基础音信,我们可以而且改造本人事先介绍过的Winform之HTML编辑控件:ZetaHtml艾德itControl了(享受2个Winform里面包车型地铁HTML编辑控件Zeta
HTML 艾德it
Control,汉化附源码),笔者对那么些控件全数英文的菜单、工具栏、对话框、提醒内容等能源实行汉语化后,并在工具栏中追加插入图片、打字与印刷功用后,分界面如下所示。

图片 4

暗许景况下,我们参预图片的办法,料定依然依据当麻芋果件的点子了;可是透过我们改变使用FTP上传文件措施后,在控件上获得HTTP地址,就足以对图纸文件进行预览展现的操作了。

这种格局组织的图样地址,属于标准的U福睿斯L地址,能够在各样地点开始展览查看的,如下分界面所示。

图片 5

本条正是ZetaHtmlEditControl控件,整合大家最近已经落成了FTP上传形式的附件管理模块,达成编辑在线HTML的成效,那样的HTML内容,一样能够适合在Web分界面下的HTML编辑器上拓展呈现了。

如上正是笔者为全体WInform开拓架构的品类组件,扩充的FTP上传格局,同期健全了对应的情景要求,在ZetaHtml艾德itControl控件上贯彻编辑在线HTML的效应,希望开拓的笔触对您抱有增益。

 

相关文章