文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了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架构及传统架构通用)的更多相关文章

  1. MVC5:使用Ajax和HTML5实现文件上传功能

    引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...

  2. Spring 文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId> ...

  3. Spring +SpringMVC 实现文件上传功能。。。

    要实现Spring +SpringMVC  实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...

  4. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  5. nodejs 实现简单的文件上传功能

    首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传 ...

  6. Android 实现文件上传功能(upload)

    文 件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程 序上传文件的例子.这里只写出了Android部分的 ...

  7. Springboot如何启用文件上传功能

    网上的文章在写 "springboot文件上传" 时,都让你加上模版引擎,我只想说,我用不上,加模版引擎,你是觉得我脑子坏了,还是觉得我拿不动刀了. springboot如何启用文 ...

  8. PHPCMS_V9 模型字段添加单文件上传功能

    后台有“多文件上传”功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件URL太麻烦了. 使用说明: 1.打开phpcms\modules\conte ...

  9. 配置php.ini实现PHP文件上传功能

    本文介绍了如何配置php.ini实现PHP文件上传功能.其中涉及到php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项,这些 ...

随机推荐

  1. mysql优化之参数优化(转)

    1.优化方式 硬件优化=>系统优化=>mysql配置优化=>SCHEMA优化=>sql优化=>其他解决方案(redis or MongoDB or Cassandra o ...

  2. noi.ac NOIP2018 全国热身赛 第四场 T1 tree

    [题解] 考虑从小到大枚举边权,按顺序加边. 当前树被分成了若干个联通块,若各个块内的点只能跟块外的点匹配,那么最终的min g(i,pi)一定大于等于当前枚举的边. 判断各个联通块内的点是否全部能跟 ...

  3. POJ 1949 Chores(DAG上的最长路 , DP)

    题意: 给定n项任务, 每项任务的完成用时t和完成每项任务前需要的k项任务, 求把所有任务完成的最短时间,有当前时间多项任务都可完成, 那么可以同时进行. 分析: 这题关键就是每项任务都会有先决条件, ...

  4. 计蒜客 Overlapping Rectangles (离散化)

    题意: 给定一个坐标系, 给出n个矩形的左下角坐标(bx,by)和右上角坐标(tx,ty) , 求矩形覆盖的面积, 有些区域会被多个矩形覆盖, 但只用算一次. n <= 1000,  0 < ...

  5. 根据不同的产品id获得不同的下拉选项 (option传多值)

    <td> 没有 value 所以要在<td>里面加上input  同时text 为hidden这样就不会显示value的值 <td><select id='g ...

  6. Pychorm提示Unresolved reference 导入模块报错

    最近使用Pychorm编写Python时,每次要引入自定义模块,就会报错,提示“Unresolved reference” Unresolved reference 'LoginClass' more ...

  7. [luoguP1227] [JSOI2008]完美的对称(sort)

    传送门 排序! #include <cstdio> #include <iostream> #include <algorithm> #define N 20001 ...

  8. 【ZJOI2017 Round1练习】D2T1 river(二分图)

    题意: 思路:这道题并没有官方题解 没有羊驼在所有三元组中出现就是NO 现在考虑不少于1只的情况 删去其中一只,我们得到了两组点和一些边 我们只要判断这是否为一张二分图,使用暴力染色的方法就有60分了 ...

  9. 解决ssh无操作自动断开[转载,已经验证]

    用SSH远程,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,非常麻烦,一般修改2个地方3项即可解决问题: 1.终端键入:echo $TMOUT       如果显示空白,表示没有设置,等于使 ...

  10. webstorm初始化

    1.皮肤设置,重启后Terminal皮肤生效 2.排除目录 2.1全局排除 2.2局部排除 选中文件夹 右击Make Directroy As 选择 Excluded 3.代码自定义 3.1 cons ...