在附件管理模块中增加对FTP 上传和预览的支持
在之前介绍的附件管理模块里面《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地址: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 = ;
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);
}
其中我们的配置文件如下所示。
使用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的功能,希望开发的思路对您有所增益。
在附件管理模块中增加对FTP 上传和预览的支持的更多相关文章
- vue开发中vue-resource + canvas 图片压缩、上传、预览
1.使用vue-resource上传,也可以自定义ajax上传: 2.使用<input type="file" @change="submit()" na ...
- BBS项目详解(forms快速创建登陆页面,登陆验证、通过阅读器进行头像上传的预览、内存管理器)
BBS项目涉及的知识点 django中知识点 钩子函数(局部钩子和全局钩子) 1.局部钩子就是用来做合法性校验,比如用户名有没有被使用等 2.全局的就是用来做对比校验,比如两次输入的密码是否一致 3. ...
- ASP.NET MVC图片管理(上传,预览与显示)
先看看效果(下面gif动画制作有点大,5.71MB): 题外话:上面选择图片来源于Insus.NET的新浪微博:http://weibo.com/104325017 也是昨晚(2015-07-03)I ...
- form表单系列中文件上传及预览
文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...
- FTP上传与下载
1.连接 先假设一个ftp地址 用户名 密码 FTP Server: 192.168.1.125 User: administrator Password: abc123 2. 打开win ...
- Winform开发框架之通用附件管理模块 --SNF快速开发平台3.3-Spring.Net.Framework
最近项目太多都没有时间写文章了,实际项目需求一,CS端和windows平板都需要附件上传管理功能.以前做的都是BS的附件管理和上传功能.本来计划在Winform上嵌套一个浏览器直接用bs的附件上传功能 ...
- Odoo8模块中增加延时自动消失的提示
在odoo中,如果必要栏位没有值,在保存时右上角会有如下图的提示,该提示会延时并自动关闭. 有网友问如何在自己的模块中增加这样的提示,以方便用户在操作时,能提示一些必要的信息.下面例出大致的步骤以供参 ...
- python之模块ftplib(实现ftp上传下载代码)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...
- 【Python学习 】Python实现的FTP上传和下载功能
一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...
随机推荐
- 【2017-04-18】Ado.Net C#连接数据库进行增、删、改、查
一.简介 1.ado.net是一门数据库访问技术. 他可以通过程序来操作数据库 2.类库 Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接 ...
- Linux - atexit()(注册终止)函数
进程终⽌的⽅式有8种,前5种为正常终⽌,后三种为异常终⽌: 1. 从main函数返回: 2 .调⽤exit函数:3 .调⽤_exit或_Exit:4 .最后⼀个线程从启动例程返回:5 .最后⼀个线程调 ...
- mybatis插入List集合数据
处女帖 今天做完一个定时任务将一个表中的数据每天统计到另外一个表中,开始是用循环的方式向数据库添加,觉得数据库可能访问压力过大,所以就使用了mybatis的foreach标签来稍微的减少压力. 首先封 ...
- 从JDBC到hibernate再到mybatis之路
一.传统的JDBC编程 在java开发中,以前都是通过JDBC(Java Data Base Connectivity)与数据库打交道的,至少在ORM(Object Relational Mappin ...
- 第二章、元组和列表(python基础教程第二版 )
最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...
- Linux基础(6)
Linux基础(六) shell脚本中的三大循环和函数知识点 一.流程控制之if结构 1.简单的if实例: #!/bin/bash var='/etc/init.d' #var='/dev/sda' ...
- mysql行列转换方法总结
这是一道行转列并且构造交叉表的问题: http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html 数据样 ...
- Python生产环境部署(fastcgi,uwsgi)
Python部署web开发程序的几种方法 fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass http,nginx使用proxy_pass转发,这个要求 ...
- 蓝桥杯-等额本金-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- C#集合之字典
字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素.字典也称为映射或散列表. 字典的主要特性是能根据键快速查找值.也可以自由添加和删除元素,这有点像List<T>(http: ...