• 【转载】刚刚做了个文件上传功能,拿来分享一下!(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
     
        }
  • 相关阅读:
    Activity
    清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)
    Android-- FragmentStatePagerAdapter分页
    使用NServiceBus开发分布式应用
    SOA、ESB、NServiceBus、云计算 总结
    ESB简介及选型(转) http://www.cnblogs.com/skyme/archive/2012/08/06/2623414.html
    C# 版dll 程序集合并工具
    83款 网络爬虫开源软件
    13个.Net开源的网络爬虫
    IE6浏览器的bug问题及相关解决的方法
  • 原文地址:https://www.cnblogs.com/fx2008/p/2283187.html
Copyright © 2020-2023  润新知