zoukankan      html  css  js  c++  java
  • 刚刚做了个文件上传功能,拿来分享一下!(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
    
     
    
        }
  • 相关阅读:
    BZOJ 4016: [FJOI2014]最短路径树问题
    BZOJ 2599: [IOI2011]Race
    BZOJ 2152: 聪聪可可
    Codeforces Round #532 (Div. 2) Solution
    KEYENCE Programming Contest 2019 Solution
    AISing Programming Contest 2019 Solution
    Educational Codeforces Round 58 Solution
    2018-2019 ACM-ICPC, Asia East Continent Finals Solution
    Codeforces Round #530 (Div. 2) Solution
    Hello 2019 Solution
  • 原文地址:https://www.cnblogs.com/lori/p/2110749.html
Copyright © 2011-2022 走看看