刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)
文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI(WEB)层与Service层(BLL)的桥梁.
结构
上传基类:
上传文件的接口规范:
接口的实现:
UI层调用WEB.Service层的上传功能:(附代码)

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

下面公布一下上传的基类代码:(如果有设计不合理的地方,欢迎大家留言)

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

文件上传实现类:

- 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等选项,这些 ...
随机推荐
- windows环境下Robot Framework的安装步骤
Robot Framework是由python编写的开源的用来做功能性测试的自动化测试框架.本文介绍Robot Framework在windows环境下的安装步骤. 安装python从python官网 ...
- bash实现自动补全
yum install -y bash-completion source /usr/share/bash-completion/bash_completion 执行后yum拥有选项自动补全功能 对于 ...
- DB2表空间
https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0902yuancg/ 临时表空间的使用 (sorts or jo ...
- LeetCode(237)Delete Node in a Linked List
题目 Write a function to delete a node (except the tail) in a singly linked list, given only access to ...
- xtu summer individual 2 D - Colliders
Colliders Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Origi ...
- Jquery跨域请求
在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaSc ...
- lubuntu通过Smb访问Windows共享目录
lubuntu通过Smb访问Windows共享目录 如果未安装Smb,先安装: apt-get install smbclient smbfs 安装后,查看共享主机上的共享目录: CentOS/Red ...
- 那些“不务正业”的IT培训公司
Before First 大四下期了,现在准备找一份Java开发的实习工作,于是在各大网站上投递简历-智联招聘.51job.拉勾网,慧眼识真金的我必然会把培训机构给过滤掉,对于重庆来说招聘实习的公司少 ...
- 【PD】PowerDesigner生成数据字典
1.首先说明我使用的环境 --------------------------------第一种:不按模板导出导出数据字典----------------------------- 2.打开PDM模型 ...
- tomcat并发数
Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的.更好的硬件,更多的处理器都会使Tomcat支持更多的并发. Tomcat默认的HTTP实现是采用阻塞式 ...