95992828九五至尊2

在附件管理模块中加进对FTP882828九五至尊手机版,Winform开发框架之附件管理选拔

二月 9th, 2019  |  882828九五至尊手机版

在不少正常化的治本连串里面,都可能有附件管理的须求,在本人做的一名目繁多医疗行业的患儿新闻保管体系里头,都希望能很好的管制患者的相关材料,分门别类的举行仓储,须求的时候可以预览查看,那么那一个效应大家得以把它独自做成一个附件管理模块,这样可以在种种系统中合拢即可,我一度在《Winform开发框架之通用附件管理模块》里面介绍过那样的附件模块,从那时候开头了,我索要附件模块的时候,就透过购并起来即可,分外方便连忙。

在头里介绍的附件管理模块里面《Winform开发框架之通用附件管理模块》以及《Winform开发框架之附件管理选择》,介绍了附件的管理作用,通过对数据库记录的拍卖和文件的管制,已毕了附件文件和著录的咬合管理,可以利用在单机版的WInform框架,也得以选择在分布式的混合式开发框架中,随着部分付出景况的拉长,大家需求以FTP格局上传文件,因而对那么些附件管理模块举办扩充,以便适合越多的莫过于项目需要。

1、附件管理界面显示

882828九五至尊手机版,附件管理在广大音信化管理种类中很宽泛利用,例如我在患儿管理连串界面里面,可以在一个界面里面分门别类管理很多映像学的图片资料,通过翻看附件,可以观察里面有些图片附件的缩略图,必要进一步查看,可以双击图片即可兑现预览效果。

882828九五至尊手机版 1

随访音信界面也得以录入一些有关的附件新闻。

882828九五至尊手机版 2

附件管理的上传界面如下所示,可以从本地接纳三个文件一并上传,每个文件上传成功后旋即突显状态。

882828九五至尊手机版 3

上传后,界面以缩略图进行浮现,假设急需删除,勾选“全体抉择”、“拔取附件”选项即可。

882828九五至尊手机版 4

图形双击后得以拓展预览,假使别的文件,那么可以下载后打开。

882828九五至尊手机版 5

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

俺们考虑的附件管理,底层都是内需在Winform、Web等支付项目上重用的,由此底层的规划需求考虑好相应的拍卖,别的前边可以利用WInform的HTML编辑控件、或者Web的HTML编辑控件进行合并,附件则是统一在一个零部件里面落成的。
依傍FTP的文本上传,大家单机版本或者依照局域网的Winform界面程序,也可以独自打造一个FTP服务器,完结文件的共享;而分布式的混合式开发框架中,对于文本的上传,可以挑选基于服务的文件系统写入,同时也得以依照FTP的点子上传。
基于混合式框架的FTP形式上传文件,其逻辑关系如下所示。

882828九五至尊手机版 6

如此文件通过FTP方式上传的文件系统后,大家在文件系统里面搭建一个HTTP服务,那样对应上的HTTP地址就足以兑现文件的下载,以及图片的查阅等操作了(可以在HTML编辑器中贯彻)。

2、附件模块的行使代码显示

1)由于附件管理已经封装好控件了,所以在利用的时候,拖动到界面即可。

882828九五至尊手机版 7

在界面后台代码里面,给它绑定相关的特性即可,上边是大家绑定呈现附件的操作。

        //PatientInfo在对象存在则为指定对象,新建则是全新的对象,初始化的GUID用于附件上传 
       private void SetAttachInfo(PatientInfo info)
        {
            this.attachBeforeCT.AttachmentGUID = info.BeforeCT;
            this.attachBeforeMRI.AttachmentGUID = info.BeforeMRI;
            this.attachBeforeXRay.AttachmentGUID = info.BeforeXRay;
            this.attachBeforeBitSlice.AttachmentGUID = info.BeforeBitSlice;
            this.attachBeforePicture.AttachmentGUID = info.BeforePicture;

            this.attachMiddlePicture.AttachmentGUID = info.MiddlePicture;
            this.attachMiddleVideo.AttachmentGUID = info.MiddleVideo;
            this.attachMiddleXRay.AttachmentGUID = info.MiddleXRay;

            this.attachAfterCT.AttachmentGUID = info.AfterCT;
            this.attachAfterMRI.AttachmentGUID = info.AfterMRI;
            this.attachAfterXRay.AttachmentGUID = info.AfterXRay;
            this.attachAfterBitSlice.AttachmentGUID = info.AfterBitSlice;
            this.attachAfterPicture.AttachmentGUID = info.AfterPicture;
        }

在图纸存储中,大家一般是按照伤者姓名和ID号举办存放的,所以附件的目录须要根据参数举办点名,代码如下所示。

        /// <summary>
        /// 当修改患者姓名或者ID号的时候,改变附件的目录位置
        /// </summary>
        private void SetAttachmentPath()
        {
            if (!this.DesignMode)
            {
                string patientName = this.txtName.Text.Trim();
                string IdNumber = this.txtIDNumber.Text.Trim();
                if (!string.IsNullOrEmpty(patientName) && !string.IsNullOrEmpty(IdNumber))
                {
                    string dir = string.Format("{0}.{1}", patientName, IdNumber);
                    this.attachBeforeCT.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachBeforeMRI.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachBeforeXRay.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachBeforeBitSlice.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachBeforePicture.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);

                    this.attachMiddlePicture.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachMiddleVideo.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachMiddleXRay.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);

                    this.attachAfterCT.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachAfterMRI.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachAfterXRay.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachAfterBitSlice.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                    this.attachAfterPicture.Init(dir, PatientInfo.ID, Portal.gc.LoginInfo.Name);
                }
            }
        }

其中代码那多少个Init函数的概念如下所示,那样我们就领会附件属于至极病者的笔录,属于万分登陆用户上传的了,方便我们前面对附件进行分类管理和操纵。

        /// <summary>
        /// 初始化相关参数
        /// </summary>
        /// <param name="attachmentDir">设置附件的存储目录分类</param>
        /// <param name="owerId">附件组所属的记录ID,如属于某个主表记录的ID</param>
        /// <param name="userId">操作用户ID,当前登录用户</param>
        public void Init(string attachmentDir, string owerId, string userId)

由于附件有单独的存储模块,因而我们不需求为附件的上传以及数据库记录的囤积做任何特殊的操作,只必要报告附件它对应的记录GUID,并起始化它的目录地方即可。

该附件界面以下一些,可以应用在价值观Winform中,也得以利用WCF的分布式应用程序中,还足以选择在Web开发里面,如本人事先写的Web开发界面中有关附件上传的操作,利用的就是那么些内容,只是界面须要重新处理而已。

882828九五至尊手机版 8

里面的

882828九五至尊手机版 9

 以上就是Winform开发框架中附件管理模块的选拔场景和运用代码的突显,希望大家多多提议,吸收更好的看法,做的更好。 

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

其中大家的安顿文件如下所示。

882828九五至尊手机版 10

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

882828九五至尊手机版 11

有了这个基础新闻,大家可以而且改造自己后面介绍过的Winform之HTML编辑控件:ZetaHtmlEditControl了(享用一个Winform里面的HTML编辑控件Zeta
HTML Edit
Control,汉化附源码
),我对那一个控件所有英文的食谱、工具栏、对话框、提醒内容等资源开展普通话化后,并在工具栏中加进插入图片、打印功用后,界面如下所示。

882828九五至尊手机版 12

默许意况下,大家投入图片的艺术,肯定仍旧基于本地文件的不二法门了;不过经过大家改造使用FTP上传文件措施后,在控件上取得HTTP地址,就足以对图纸文件进行预览显示的操作了。
那种艺术社团的图片地址,属于标准的URL地址,能够在依次地方开展查看的,如下界面所示。

882828九五至尊手机版 13

这几个就是ZetaHtmlEditControl控件,整合大家眼前早已成功了FTP上传形式的附件管理模块,达成编辑在线HTML的效应,那样的HTML内容,同样可以适合在Web界面下的HTML编辑器上进行体现了。
如上就是自个儿为所有WInform开发框架结构的品类组件,增添的FTP上传格局,同时周详了对应的情景需要,在ZetaHtmlEditControl控件上落实编辑在线HTML的成效,希望开发的思路对您拥有增益。

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图