刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)

简介:

文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI(WEB)层与Service层(BLL)的桥梁.

结构

image

上传基类:

image

上传文件的接口规范:

image

 

 

接口的实现:

image

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架构及传统架构通用),如需转载请自行联系原博主。

目录
相关文章
|
3月前
|
前端开发 Java 开发者
MVC 架构模式技术详解与实践
本文档旨在全面解析软件工程中经典且至关重要的 MVC(Model-View-Controller) 架构模式。内容将深入探讨 MVC 的核心思想、三大组件的职责与交互关系、其优势与劣势,并重点分析其在现代 Web 开发中的具体实现,特别是以 Spring MVC 框架为例,详解其请求处理流程、核心组件及基本开发实践。通过本文档,读者将能够深刻理解 MVC 的设计哲学,并掌握基于该模式进行 Web 应用开发的能力。
505 1
|
9月前
|
网络协议 Java 应用服务中间件
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
本文首先分享了《活出意义来》一书序言中的感悟,强调成功如同幸福,不是刻意追求就能得到,而是全心投入时的副产品。接着探讨了Tomcat的核心功能与架构解析,包括网络连接器(Connector)和Servlet容器(Container),并介绍了其处理HTTP请求的工作流程。文章还详细解释了Tomcat的server.xml配置文件,涵盖了从顶级容器Server到子组件Connector、Engine、Host、Context等的配置参数及作用,帮助读者理解Tomcat的内部机制和配置方法。
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
9月前
|
运维 供应链 前端开发
中小医院云HIS系统源码,系统融合HIS与EMR功能,采用B/S架构与SaaS模式,快速交付并简化运维
这是一套专为中小医院和乡镇卫生院设计的云HIS系统源码,基于云端部署,采用B/S架构与SaaS模式,快速交付并简化运维。系统融合HIS与EMR功能,涵盖门诊挂号、预约管理、一体化电子病历、医生护士工作站、收费财务、药品进销存及统计分析等模块。技术栈包括前端Angular+Nginx,后端Java+Spring系列框架,数据库使用MySQL+MyCat。该系统实现患者管理、医嘱处理、费用结算、药品管控等核心业务全流程数字化,助力医疗机构提升效率和服务质量。
506 4
|
9月前
|
人工智能 前端开发 Java
DDD四层架构和MVC三层架构的个人理解和学习笔记
领域驱动设计(DDD)是一种以业务为核心的设计方法,与传统MVC架构不同,DDD将业务逻辑拆分为应用层和领域层,更关注业务领域而非数据库设计。其四层架构包括:Interface(接口层)、Application(应用层)、Domain(领域层)和Infrastructure(基础层)。各层职责分明,避免跨层调用,确保业务逻辑清晰。代码实现中,通过DTO、Entity、DO等对象的转换,结合ProtoBuf协议,完成请求与响应的处理流程。为提高复用性,实际项目中可增加Common层存放公共依赖。DDD强调从业务出发设计软件,适应复杂业务场景,是微服务架构的重要设计思想。
|
9月前
|
算法 前端开发 定位技术
地铁站内导航系统解决方案:技术架构与核心功能设计解析
本文旨在分享一套地铁站内导航系统技术方案,通过蓝牙Beacon技术与AI算法的结合,解决传统导航定位不准确、路径规划不合理等问题,提升乘客出行体验,同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文档可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~
613 1
|
9月前
|
存储 智能硬件
CPU的定义与功能与架构
CPU(中央处理器)是计算机的核心部件,负责执行程序指令、控制数据传输和进行运算。它能处理算术与逻辑运算,并协调其他硬件协同工作。x86架构源于英特尔,适用于PC和服务器,采用复杂指令集;ARM架构则由Acorn等公司开发,广泛用于移动设备和嵌入式系统,采用精简指令集,功耗低且能效比高。
1030 5
|
12月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
343 5
|
Kubernetes 调度 算法框架/工具
NVIDIA Triton系列02-功能与架构简介
本文介绍了NVIDIA Triton推理服务器的功能与架构,强调其不仅适用于大型服务类应用,还能广泛应用于各类推理场景。Triton支持多种模型格式、查询类型和部署方式,具备高效的模型管理和优化能力,确保高性能和系统稳定性。文章详细解析了Triton的主从架构,包括模型仓库、客户端应用、通信协议和推理服务器的核心功能模块。
592 1
NVIDIA Triton系列02-功能与架构简介
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。