心想事成了附件文件和著录的咬合管理,完结了附件文件和记录的整合管理

在事先介绍的附件管理模块里面《Winform开发框架之通用附件管理模块》以及《Winform开发框架之附件管理选取》,介绍了附件的管制效果,通过对数据库记录的处理和文书的管住,达成了附件文件和记录的组成管理,可以选用在单机版的WInform框架,也足以运用在分布式的混合式开发框架中,随着有些开发意况的丰裕,我们需求以FTP格局上传文件,由此对那么些附件管理模块进行扩大,以便适合越多的其实项目须要。

在前头介绍的附件管理模块里面《Winform开发框架之通用附件管理模块》以及《Winform开发框架之附件管理应用》,介绍了附件的管住作用,通过对数据库记录的处理和文书的治本,完结了附件文件和笔录的三结合管理,可以应用在单机版的WInform框架,也可以利用在分布式的混合式开发框架中,随着有些支出情状的丰裕,大家须求以FTP形式上传文件,由此对这一个附件管理模块举行扩张,以便适合越多的骨子里项目须要。

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

咱俩考虑的附件管理,底层都是急需在Winform、Web等开销项目上重用的,因而底层的筹划须要考虑好相应的拍卖,别的后边可以选择WInform的HTML编辑控件、或者Web的HTML编辑控件举行合并,附件则是统一在一个组件里面完毕的。

依靠FTP的文本上传,大家单机版本或者依照局域网的Winform界面程序,也足以独立构建一个FTP服务器,完成公文的共享;而分布式的混合式开发框架中,对于文本的上传,可以选用基于服务的文件系统写入,同时也足以依照FTP的办法上传。

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

 图片 1

如此文件通过FTP格局上传的文件系统后,我们在文件系统里面搭建一个HTTP服务,那样对应上的HTTP地址就可以完成公文的下载,以及图片的查看等操作了(可以在HTML编辑器中完毕)。

 

1、FTP上传、HTTP文件预览完成思路

大家着想的附件管理,底层都是索要在Winform、Web等支出品种上重用的,由此底层的统筹需求考虑好相应的处理,其余前面可以选取WInform的HTML编辑控件、或者Web的HTML编辑控件进行集成,附件则是联合在一个组件里面已毕的。
依傍FTP的公文上传,大家单机版本或者按照局域网的Winform界面程序,也足以独立构建一个FTP服务器,达成公文的共享;而分布式的混合式开发框架中,对于文本的上传,能够选拔基于服务的文件系统写入,同时也可以根据FTP的法门上传。
据悉混合式框架的FTP格局上传文件,其逻辑关系如下所示。

图片 2

如此文件通过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的登陆、文件上传、下载等操作了。

 

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);
        }

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

图片 3

利用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地址即可,我们来看望对应的数据库记录截图如下所示。

图片 4

有了那么些基础新闻,咱们可以而且改造自我前边介绍过的Winform之HTML编辑控件:ZetaHtmlEditControl了(享受一个Winform里面的HTML编辑控件Zeta
HTML Edit
Control,汉化附源码
),我对那几个控件所有英文的菜系、工具栏、对话框、提醒内容等资源进行中文化后,并在工具栏中追加插入图片、打印效能后,界面如下所示。

图片 5

默许情况下,大家出席图片的点子,肯定仍旧基于本地文件的主意了;不过通过大家改造使用FTP上传文件措施后,在控件上获取HTTP地址,就足以对图纸文件进行预览呈现的操作了。

那种措施社团的图纸地址,属于标准的URL地址,可以在依次地点开展查看的,如下界面所示。

图片 6

其一就是ZetaHtmlEditControl控件,整合大家眼前已经形成了FTP上传情势的附件管理模块,落成编辑在线HTML的机能,那样的HTML内容,同样能够适合在Web界面下的HTML编辑器上开展浮现了。

上述就是本人为任何WInform开发框架结构的体系组件,伸张的FTP上传格局,同时完美了相应的气象须求,在ZetaHtmlEditControl控件上落到实处编辑在线HTML的效果,希望开发的思路对你有所增益。

 

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);
}

里头大家的布局文件如下所示。

图片 7

使用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地址即可,大家来探视对应的数据库记录截图如下所示。

图片 8

有了这几个基础新闻,我们得以同时改造自我前边介绍过的Winform之HTML编辑控件:ZetaHtmlEditControl了(分享一个Winform里面的HTML编辑控件Zeta
HTML Edit
Control,汉化附源码
),我对那个控件所有英文的菜系、工具栏、对话框、提醒内容等资源拓展汉语化后,并在工具栏中加进插入图片、打印效率后,界面如下所示。

图片 9

默认情状下,大家投入图片的章程,肯定依然基于本地文件的措施了;不过经过大家改造使用FTP上传文件格局后,在控件上收获HTTP地址,就可以对图片文件举行预览体现的操作了。
那种艺术协会的图片地址,属于标准的URL地址,可以在依次地点开展查看的,如下界面所示。

图片 10

那一个就是ZetaHtmlEditControl控件,整合大家眼前已经做到了FTP上传格局的附件管理模块,已毕编辑在线HTML的作用,这样的HTML内容,同样可以顺应在Web界面下的HTML编辑器上开展体现了。
以上就是自己为全部WInform开发框架结构的种类组件,扩充的FTP上传方式,同时完善了相应的气象要求,在ZetaHtmlEditControl控件上已毕编辑在线HTML的功用,希望开发的思绪对你有所增益。

相关文章