多项目上传文件解决方案之:服务器端
关于服务器端,其实就是一个文件中转站,将客户端上传的文件先保存在服务器端的临时文件夹里,然后再通过ftp类上传到相关的资源服务器上,上传完成后删除文件,返回给客户端资源的访问路径。
前面了提到过了。在服务器端只需要提供两个接口。一个获取配置参数、一个上传文件。接下来详细的介绍下这两个接口,以及实现方式。
准备工作:
一台资源服务器。要求:
1、一个http访问入口。
2、一个ftp帐号。需要有上传文件、创建目录权限。ftp帐号的根目录需要访问入口能访问得到。
开发工具:vs2012。使用MVC4.0。
准备工作就需后,我们就可以进入编码工作了。
首先我们定义一个类用来序列化、反序列化配置文件。 Upload.cs
public class Upload : ConfigCache.IConfiger { /// <summary> /// 以/结尾 例如:http://www.xxx.com/ 或者 http://www.xxx.com/file/ /// </summary> public string BasePath { get; set; } public string FtpAddress { get; set; } public string FtpPort { get; set; } public string FtpUser { get; set; } public string FtpPwd { get; set; } public UploadItem[] UploadItem { get; set; } } public class UploadItem { /// <summary> /// 分类 /// </summary> public string Type { get; set; } /// <summary> /// 备注说明 /// </summary> public string Remark { get; set; } /// <summary> /// 允许上传的文件类型 .mp4;.mov /// </summary> public string ExtendTypes { get; set; } /// <summary> /// 允许上传文件最大长度(0不限制) /// </summary> public int maxLength { get; set; } /// <summary> /// 上传路径(前不带/,后带/ 例如:mobile/ 或 moblie/2013/) /// </summary> public string Path { get; set; } /// <summary> /// 路径增加的时间格式化路径 如:年月日 yyyy/MM/dd/ 注意最后一个带/ /// </summary> public string PathDateTimeFormat { get; set; } /// <summary> /// 缩放宽(图片) /// </summary> public int ZoomWidth { get; set; } /// <summary> /// 缩放高(图片) /// </summary> public int ZoomHeight { get; set; } /// <summary> /// 获取完整路径 /// </summary> /// <returns></returns> public string GetFullPath() { string path = Path; if (!string.IsNullOrEmpty(this.PathDateTimeFormat)) { path += DateTime.Now.ToString(this.PathDateTimeFormat); } return path; } }
定义完成类后,接下来看一下生成的配置文件,Upload.config。
<?xml version="1.0"?> <!--上传文件配置--> <Upload> <BasePath>http://192.168.2.101:9004/</BasePath> <FtpAddress>192.168.2.101</FtpAddress> <FtpPort>21</FtpPort> <FtpUser>ftp_user_9004</FtpUser> <FtpPwd>ftp_pwd_9004</FtpPwd> <UploadItem> <UploadItem> <Type>media</Type> <Remark>作品</Remark> <ExtendTypes>.mp4;.mov;.iso</ExtendTypes> <maxLength>10485760</maxLength> <Path>mobile/</Path> <PathDateTimeFormat>yyyy/MM/dd/</PathDateTimeFormat> </UploadItem> <UploadItem> <Type>mediaimg</Type> <Remark>作品截图(封面)</Remark> <ExtendTypes>.jpg;.png</ExtendTypes> <maxLength>10485760</maxLength> <Path>mobile/</Path> <PathDateTimeFormat>yyyy/MM/dd/</PathDateTimeFormat> </UploadItem> <UploadItem> <Type>avatar</Type> <Remark>用户头像</Remark> <ExtendTypes>.jpg;.png</ExtendTypes> <maxLength>10485760</maxLength> <Path>mobile/</Path> <PathDateTimeFormat>yyyy/MM/dd/</PathDateTimeFormat> </UploadItem> </UploadItem> </Upload>
各节点说明:
主节点:
BasePath:返回路径的主域名路径。
FtpAddress:资源服务器上的ftp地址。
FtpPort:ftp端口。
FtpUser:ftp帐号。
FtpPwd:ftp密码。
子节点:
Type:类型,每一个配置文件.config,确定有且只有一个type名称。type相当于数据库表中的主键。
Remark:标识,也是备注的意思方便以后在看这个节点时知道这个分类是用在什么位置。
ExtendTypes:允许上传的文件类型,多个文件类型以“;”分割。
maxLength:允许上传的文件大小以kb为单位。
Path:相对路径。
PathDateTimeFormat:用来在Path路径基础上增加子目录。在这里目前只做了时间类型的处理。
以第一个节点为例,完整路径是:http://192.168.2.101:9004/mobile/2013/10/01/xxx.mp4 这下应该明白了吧。
对外提供接口,上面也提到了。所有的接口都在flash里调用。总共需要两个接口。
第一个:获取配置信息(即上传文件大小、允许文件类型)
第二个:上传文件。这个就是普通的上传接收文件信息了。在上传完文件后,加了一个ftp服务,将文件上传至相关的资源服务器上。此时上传完成。将相关资源服务器路径返回给flash。
配置文件和配置类都有了,接下我们要获取相关的配置信息。
/// <summary> /// 获取配置信息 /// </summary> /// <param name="appconfig"></param> /// <param name="type"></param> /// <returns></returns> protected Entity.Config.UploadItem getConfig(string appconfig, string type) { string config_path = CommonHelper.WebConfig.GetWebConfig(string.Format("config:{0}", appconfig), ""); if (!string.IsNullOrEmpty(config_path)) { upload = ConfigCache.ConfigFactory.Instance.GetConfig<Entity.Config.Upload>(config_path); if (upload != null && upload.UploadItem != null) { return upload.UploadItem.FirstOrDefault(i => i.Type.Equals(type)); } } return null; }
接下来我们就可以实现第一个接口了,获取配置信息:
/// <summary> /// flash 获取上传的配置信息 /// </summary> /// <param name="appconfig">配置文件名称</param> /// <param name="type">上传节点名称</param> /// <returns></returns> public ContentResult get_config(string appconfig, string type) { var con = getConfig(appconfig, type); int maxlength = 0; string ext = ""; if (con != null) { maxlength = con.maxLength; ext = con.ExtendTypes; } return Content(string.Format("{0}|{1}", maxlength, ext)); }
到目前为止,我们已经实现了第一个接口。接下实现第二个接口,也就是上传文件的接口。
第一个接口中已经有了获取上传配置信息(get_config)的方法了。所以在上传文件接口中直接使用get_config方法。
UploadItem config= getConfig(appconfig, type);
有了配置信息我们就可以对文件进行接收了先保存在临时文件夹里。相关方法就不再粘贴了,网上有好多现成的例子。呵呵。
接下来需要将保存的文件通过ftp上传至服务器上。上传至服务器上的路径在上面的 UploadItem 类中有实现,GetFullPath方法。
ftp相关的方法也不再粘贴了。
嘿嘿,很多代码在网上都可以找得到,我只在将相关的代码组合在一起,方便自己使用,如果大家有需要可以me我。
注:
1、CommonHelper.WebConfig类是对web.config访问的一些方法封装。简单来说就是获取配置信息。
2、ConfigCache.ConfigFactory.Instance 类是对 实体类 与 XML(.config) 文件序列化与反序列化操作。