刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)
文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI(WEB)层与Service层(BLL)的桥梁.
结构
上传基类:
上传文件的接口规范:
接口的实现:
UI层调用WEB.Service层的上传功能:(附代码)
![](https://common.cnblogs.com/images/copycode.gif)
public class FileUploadController : Controller { WEB.Services.IFileUpload iFileUpload = null; public FileUploadController() { iFileUpload = new WEB.Services.FileUpload(); } #region 文件上传 public ActionResult uploadheadpic() { return View(); } [HttpPost] public ActionResult uploadheadpic(FormCollection formcollection) { if (Request.Files.Count > 0) { HttpPostedFileBase file = Request.Files[0]; Entity.Commons.VMessage vm = iFileUpload.Image(WEB.Services.UpLoadType.DownloadUrl, file); if (vm.IsComplete) TempData["PicUrl"] = "{result:true,msg:\"" + vm[0].Replace("\"", "") + "\"}"; else TempData["PicUrl"] = "{result:false,msg:\"" + vm[0].Replace("\"", "") + "\"}"; } return View(); } #endregion }
![](https://common.cnblogs.com/images/copycode.gif)
下面公布一下上传的基类代码:(如果有设计不合理的地方,欢迎大家留言)
![](https://common.cnblogs.com/images/copycode.gif)
namespace WEB.Services { #region 所需枚举 /// <summary> /// 文件上传类型 /// </summary> public enum UpLoadType { /// <summary> /// 下载地址 /// </summary> DownloadUrl = 0, /// <summary> /// 文件地址 /// </summary> FileUrl = 1, } /// <summary> /// 上传错误信息列举 /// </summary> public enum WarnEnum { ImgContentType, ImgContentLength, ImgExtension, } #endregion #region 文件上传基本服务类 /// <summary> /// 文件上传基本服务类 /// </summary> public abstract class FileUploadBase { /// <summary> /// 图片MIME /// </summary> protected static List<string> imgMIME = new List<string> { "application/x-zip-compressed", "application/octet-stream", "application/x-compressed", "application/x-rar-compressed", "application/zip", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/msword", "image/jpeg", "image/gif", "audio/x-mpeg", "audio/x-wma", "application/x-shockwave-flash", "video/x-ms-wmv", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.presentationml.presentation", }; /// <summary> /// 验证消息字典 /// </summary> protected static Dictionary<WarnEnum, string> msgDIC = new Dictionary<WarnEnum, string> { {WarnEnum.ImgContentType ,"只能上传指定类型的文件!" }, {WarnEnum.ImgContentLength ,"只能上传文件大小为{0}以下!" }, {WarnEnum.ImgExtension , "文件的扩展文件不正确"} }; /// <summary> /// 相对地址字典 /// </summary> protected static Dictionary<UpLoadType, string> relativePathDic = new Dictionary<UpLoadType, string> { {UpLoadType.DownloadUrl ,@"DownLoad/" }, {UpLoadType.FileUrl ,@"FileUpload/" }, }; /// <summary> /// 图片后缀 /// </summary> protected static string[] imgExtension = { "xls", "doc", "zip", "rar", "ppt", "docx", "xlsx", "pptx", "mp3", "wma", "swf", "jpg", "jpeg", "gif" }; } #endregion }
![](https://common.cnblogs.com/images/copycode.gif)
文件上传实现类:
![](https://common.cnblogs.com/images/copycode.gif)
public class FileUpload : FileUploadBase, IFileUpload { #region 文件上级WWW服务器及图像服务器 public Entity.Commons.VMessage Image(UpLoadType type, HttpPostedFileBase hpf) { HttpRequest Request = HttpContext.Current.Request; Entity.Commons.VMessage vmsg = new Entity.Commons.VMessage(); if (this.IsIamgeVaild(type, hpf)) { string relativePath = string.Format(VConfig.BaseConfigers.LocationUploadPath, relativePathDic[type]); string path = HttpContext.Current.Server.MapPath(relativePath); #region 建立路径 DirectoryInfo di = new DirectoryInfo(path); if (!di.Exists) { di.Create(); } #endregion string guid = Guid.NewGuid().ToString(); string fileName = string.Format("{0}{1}", guid, new FileInfo(hpf.FileName).Extension);//上传文件的名称 hpf.SaveAs(string.Format("{0}{1}", path, fileName)); vmsg.Clear(); vmsg.AddItem(string.Format("{0}://{1}{2}{3}", Request.Url.Scheme, Request.Url.Authority, relativePath.Replace('\\', '/'), fileName ) ); vmsg.AddItem(guid); vmsg.IsComplete = true; } else { vmsg.AddItemRange(this.GetRuleViolations(type, hpf)); vmsg.IsComplete = false; } return vmsg; } public Entity.Commons.VMessage ImageToServer(string url) { Entity.Commons.VMessage vmsg = new Entity.Commons.VMessage(); Uri uri = new Uri(url); string fileName = uri.Segments[uri.Segments.Length - 1]; string typeStr = uri.Segments[uri.Segments.Length - 2]; VCommons.Utils.FileUpLoad( string.Format(BaseConfigers.DefaultUploadUri, typeStr.TrimEnd('/')), HttpContext.Current.Server.MapPath(uri.LocalPath) ); vmsg.IsComplete = true; vmsg.AddItem( string.Format("{0}://{1}/upload/{2}{3}", HttpContext.Current.Request.Url.Scheme, BaseConfigers.ImageServerHost, typeStr, fileName ) ); return vmsg; } #endregion #region 验证文件 internal bool IsIamgeVaild(UpLoadType type, HttpPostedFileBase hpf) { return this.GetRuleViolations(type, hpf).Count() == 0; } /// <summary> /// 验证文件 /// </summary> /// <param name="hpf"></param> /// <returns></returns> internal IEnumerable<string> GetRuleViolations(UpLoadType type, HttpPostedFileBase hpf) { if (!imgMIME.Contains(hpf.ContentType))// MIME yield return msgDIC[WarnEnum.ImgContentType]; int contentLength = this.GetContentLengthByType(type);//文件大小 if (hpf.ContentLength > contentLength) yield return string.Format(msgDIC[WarnEnum.ImgContentLength], contentLength / 1024); if (!imgExtension.Contains(hpf.FileName.Substring(hpf.FileName.LastIndexOf('.') + 1)))//文件后缀 yield return msgDIC[WarnEnum.ImgExtension]; yield break; } #endregion #region 根据 FileUpLoadContentLengthType 类型 获取相应的大小 /// <summary> /// 根据 FileUpLoadContentLengthType 类型 获取相应的大小 /// </summary> /// <param name="type">文件上传大小枚举值</param> /// <returns>返回</returns> int GetContentLengthByType(UpLoadType type) { switch (type) { case UpLoadType.DownloadUrl: return 200000; //200M case UpLoadType.FileUrl: return 200000; default: throw new Exception("可能有错误"); } } #endregion }
刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)的更多相关文章
- MVC5:使用Ajax和HTML5实现文件上传功能
引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...
- Spring 文件上传功能
本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId> ...
- Spring +SpringMVC 实现文件上传功能。。。
要实现Spring +SpringMVC 实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- nodejs 实现简单的文件上传功能
首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传 ...
- Android 实现文件上传功能(upload)
文 件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程 序上传文件的例子.这里只写出了Android部分的 ...
- Springboot如何启用文件上传功能
网上的文章在写 "springboot文件上传" 时,都让你加上模版引擎,我只想说,我用不上,加模版引擎,你是觉得我脑子坏了,还是觉得我拿不动刀了. springboot如何启用文 ...
- PHPCMS_V9 模型字段添加单文件上传功能
后台有“多文件上传”功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件URL太麻烦了. 使用说明: 1.打开phpcms\modules\conte ...
- 配置php.ini实现PHP文件上传功能
本文介绍了如何配置php.ini实现PHP文件上传功能.其中涉及到php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项,这些 ...
随机推荐
- js layui 分页脚本
//分页 layui.use(['laypage'], function(){ var laypage = layui.laypage; laypage.render({ elem: 'page' , ...
- 搭建Mysql主从复制
mysql 主从复制流程图 Server version: 10.0.24-MariaDB-7 Ubuntu 16.04 Master 记录二进制文件 导出数据并记录二进制位置 导入数据,设置二进制位 ...
- Binlog详解
一.介绍 binlog, 即二进制文件,他记录了MySQL所有数据的变更,并以二进制的形式存储在磁盘上 二.binlog模式 binlog有三种模式:ROW(行模式), Statement(语句模 ...
- Spring Boot Web开发中Thymeleaf模板引擎的使用
这里使用的是idea 1.新建Spring Boot项目 File-->New-->Project...,然后选择左边的Spring Initializr-->Next,可根据自己的 ...
- 我的java web之路(配置开发环境)
这个学期学习java web开发,当然不能只靠上机的时间来练习,于是,便在自己的电脑上安装一系列的软件... 1.JDK的安装.首先,下载Java JDK,可以到sun公司网站下载.一定要下载适合自己 ...
- [MVC]Controller
1,控制器中所有的动作方法必须声明为public,如声明为private或protected,将不被视为动作方法. 如果将Action声明为private,或者是添加[NonAction]属性,则不对 ...
- Java基础学习总结(93)——Java编码规范之代码性能及惯例
1.避免使用包装类构造函数 按照SUN公司的说明,使用自动装箱或静态工厂方法比使用new一个对象快3到4倍,该规则可以用在valueOf或其它静态工厂的调用中(如:Short.Integer, Lon ...
- Leetcode 306.累加数
累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'- ...
- gitHub网站上常见英语翻译2
repositories资料库 compilers with rich code analysis APIs.编译器具有丰富的代码分析API. plugins插件 With a variety of ...
- strcpy c标准库函数
C语言标准库函数strcpy,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间. 已知strcpy函数的原型是: char *strcpy(char *dst, const ...