刚刚做了个文件上传功能,拿来分享一下!(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架构及传统架构通用),如需转载请自行联系原博主。

时间: 2024-09-21 07:39:51

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

Spring 文件上传功能

本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: 1 2 3 4 5 <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-web</artifactId>     <version>1.0.2.RELEASE<

Ajax 配合node js multer 实现文件上传功能

说明 作为一个node 初学者,最近在做一个聊天软件,支持注册.登录.在线单人.多人聊天.表情发送.各种文件上传下载.增删好友.聊天记录保存.通知声开关.背景图片切换.游戏等功能,所以用到了multer 模块,经过各种查文档,做demo例子,终于成功实现单个文件上传功能,支持大部分文件格式上传,同时显示到网页上 效果 是不是有种微信即视感,没错,就是根据网页版微信来做的, 要实现整体效果的话,要配合css和html来做,前端初学者,第一次发博客,实在捉急,近期,将会将代码放到github上去,感

MVC中基于Ajax和HTML5实现文件上传功能_AJAX相关

引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法--File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范. 该规格说明包含以下几个接口来使用文件: File接口:具有文件的"读

使用jQuery.form.js/springmvc框架实现文件上传功能_jquery

使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jquery的ajax方法与jquery.form.js中的ajaxSubmit方法的参数,具体细节将在下一篇博客中分享. 重点: html表格三要素: action="fileUpload/fileUpload" method="post" enctype="mul

MVC中基于Ajax和HTML5实现文件上传功能

引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法--File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范. 该规格说明包含以下几个接口来使用文件: File接口:具有文件的"读

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

引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法--File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范. 该规格说明包含以下几个接口来使用文件: File接口:具有文件的"读

如何在Web页面中集成文件上传功能

当前,个人主页制作非常流行.当用户开发好自己的页面时,需要将文件传输到服务器上,解决这个问题的方法之一是运行FTP服务器并将每个用户的FTP默认目录设为用户的Web主目录,这样用户就能运行FTP客户程序并上传文件到指定的 Web目录.由于Windows NT 和 Windows98均不提供直接的基于窗口形式的FTP客户程序,用户必须懂得如何使用基于命令行的FTP客户,或掌握一种新的基于窗口形式的FTP客户程序.因此,这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的. 如果我们能把文件上传功

在webclass中使用文件上传功能

web|上传 在webclass中使用文件上传功能 webclass实例:http://www.shinco.com/jjx/wcnews/news.asp许多文件上传组件并不能在vb中正常使用,我测试了chinaasp fileup,aspSmartupload,aspupload enterprise,inotesupload等组件,均不能正常使用.其主要原因,是因为在vb中没有促发组件的OnStartPage过程.我们无法改写这些组件,所以要自己编码来解决这个问题,记得以前有网友谈过这个问

文件上传功能,关闭网页后文件还能继续上传,再次打开网站的时候能显示文件的进度

问题描述 文件上传功能,关闭网页后文件还能继续上传,再次打开网站的时候能显示文件的进度 小弟,想开发一个b/s结构的文件上传功能,然后怎么能在关闭网页后文件还能继续上传 ,然后再次打开网站的时候能显示文件上传的进度,小弟先谢谢了! 解决方案 纯b/s肯定不行,浏览器关闭了谁去上传数据?只能是用activex去启动一个客户端程序,让它在后台上传文件. 解决方案二: 这个在B/S结构下是不能实现的,二楼的回答貌似是断点续传的实现,是你的想法? 建议你不要在这个想法上花心思了,没结果的, 冒昧问一下,