【转载】刚刚做了个文件上传功能,拿来分享一下!(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
 
    }
原文地址:https://www.cnblogs.com/fx2008/p/2283187.html