0

0

如何在附件管理模块中增加对FTP 上传和预览的支持?

零下一度

零下一度

发布时间:2017-06-23 16:20:57

|

2308人浏览过

|

来源于php中文网

原创

在之前介绍的附件管理模块里面《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服务器、用户名、密码等参数的配置实体类,如下所示。

    /// /// FTP配置信息///     [DataContract]
    [Serializable]public class FTPInfo
    {/// /// 默认构造函数/// public FTPInfo()
        {

        }/// /// 参数化构造函数/// /// /// /// public FTPInfo(string server, string user, string password, string baseUrl)
        {this.Server = server;this.User = user;this.Password = password;this.BaseUrl = baseUrl;
        }/// /// FTP服务地址///         [DataMember]public string Server { get; set; }/// /// FTP用户名///         [DataMember]public string User { get; set; }/// /// FTP密码///         [DataMember]public string Password { get; set; }/// /// FTP的基础路径,如可以指定为IIS的路径::8000 ,方便下载打开///         [DataMember]public string BaseUrl { get; set; }
    }

定义一个函数,专门用来提取配置文件里面的相关FTP参数的,如下所示。

        /// /// 获取配置的FTP配置参数/// /// 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);
        }

其中我们的配置文件如下所示。

Moonbeam
Moonbeam

经过专业培训的 AI 写作助手,可帮助您撰写各类长篇内容。

下载

使用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的功能,希望开发的思路对您有所增益。

 

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.8万人学习

Vue 教程
Vue 教程

共42课时 | 7.1万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号