从一个很简单的文件上传来品味面向对象的大局观(抽象类和功能类)

/// <summary> 
    /// 文件上传的模块 
    /// </summary> 
    public enum FileModelType 
    { 
        /// <summary> 
        /// 头像 
        /// </summary> 
        User, 
        /// <summary> 
        /// 产品图像 
        /// </summary> 
        Product, 
        /// <summary> 
        /// 店铺banner 
        /// </summary> 
        ShopBanner, 
    }

    /// <summary> 
    /// 上传警告 
    /// </summary> 
    public enum UploadWarning 
    { 
        /// <summary> 
        /// 大小错误 
        /// </summary> 
        SizeError, 
        /// <summary> 
        /// 类型错误 
        /// </summary> 
        TypeError, 
        /// <summary> 
        /// 扩展名错误 
        /// </summary> 
        Extension, 
    } 
    /// <summary> 
    /// 上传文件的基类,为实现上传的类提供公用的属性和方法 
    /// </summary> 
    public abstract class UploadHelperBase 
    { 
        protected static string[] FileMIME = { "image/gif", "image/bmp", "image/pjpeg", "image/x-png" }; //要求的文件类型

        protected static Dictionary<FileModelType, string> RelativePath = new Dictionary<FileModelType, string>  //字典对象来存储相对地位键值对的列表 
        { 
            {FileModelType.User,@"/user/"}, 
            {FileModelType.Product,@"/product/"}, 
            {FileModelType.ShopBanner,@"shopbanner/"}, 
        };

        protected static string[] FileExtensions = { "jpg", "bmp", "gif", "png", "txt" }; //文件的扩展名

        protected static Dictionary<UploadWarning, string> UploadError = new Dictionary<UploadWarning, string> //上传文件时的错误信息 
        { 
            {UploadWarning.SizeError,"大小错误,最大为{0}"}, 
            {UploadWarning.TypeError,"类型错误"}, 
            {UploadWarning.Extension,"扩展名错误"} 
        }; 
    }

  /// <summary> 
    /// 提供文件上传的实现 
    /// </summary> 
    public class UploadFile : UploadHelperBase 
{

 #region 文件上传到本WWW服务器 
        public CommonMessage UploadImage(FileModelType modelType, HttpPostedFileBase hpf) 
        { 
            CommonMessage cMessage = new CommonMessage(); 
            HttpRequest Request = HttpContext.Current.Request; 
            if (this.IsFileViolation(modelType, hpf)) 
            { 
                string path = HttpContext.Current.Server.MapPath(RelativePath[modelType]); 
                #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)); 
                cMessage.Clear(); 
                cMessage.AddItem(string.Format("{0}://{1}{2}{3}", 
                                            Request.Url.Scheme, 
                                            Request.Url.Authority, 
                                            RelativePath[modelType].Replace('\\', '/'), 
                                            filename 
                                        ) 
                            ); 
                cMessage.AddItem(guid); 
                cMessage.IsComplete = true; 
            } 
            else 
            { 
                cMessage.IsComplete = false; 
                cMessage.AddItemRange(this.GetFileViolations(modelType, hpf)); 
            } 
            return cMessage; 
        } 
        #endregion

        #region 文件验证有效性 
        internal bool IsFileViolation(FileModelType modelType, HttpPostedFileBase file) 
        { 
            return GetFileViolations(modelType, file).Count() == 0; 
        } 
        /// <summary> 
        /// 验证文件有效性,反回一个简单迭代 
        /// </summary> 
        /// <param name="modelType"></param> 
        /// <param name="file"></param> 
        /// <returns></returns> 
        internal IEnumerable<string> GetFileViolations(FileModelType modelType, HttpPostedFileBase file) 
        { 
            if (!FileMIME.Contains(file.ContentType)) 
                yield return UploadError[UploadWarning.TypeError]; 
            if (!FileExtensions.Contains(file.FileName.Remove(0, file.FileName.LastIndexOf('.') + 1).ToLower())) 
                yield return UploadError[UploadWarning.Extension]; 
            if (file.ContentLength > GetAllowSizeByFileModelType(modelType)) 
                yield return string.Format(UploadError[UploadWarning.SizeError], GetAllowSizeByFileModelType(modelType) / 1000);

        } 
        #endregion

        #region 通过模块类型,得到被充许的容量大小 
        /// <summary> 
        /// 通过文件模块类型,得到被指定的最大文件容量 
        /// </summary> 
        /// <param name="modelType"></param> 
        /// <returns></returns> 
        int GetAllowSizeByFileModelType(FileModelType modelType) 
        { 
            switch (modelType) 
            { 
                case FileModelType.User: 
                    return 1000000; //1000KB 
                    break; 
                case FileModelType.Product: 
                    return 2000000; 
                    break; 
                case FileModelType.ShopBanner: 
                    return 3000000; 
                    break; 
                default: 
                    throw new Exception("error"); 
                    break;

            } 
        } 
        #endregion

        #region 获取Url文件名 
        /// <summary> 
        /// 获取Url文件名 
        /// </summary> 
        /// <param name="url">Url</param> 
        /// <returns>Url文件名</returns> 
        string GetUrlFileNameWithoutExtension(string url) 
        { 
            return System.IO.Path.GetFileNameWithoutExtension(url.Substring(url.LastIndexOf('/') + 1)); 
        } 
        #endregion

  }

本文转自博客园张占岭(仓储大叔)的博客,原文链接:从一个很简单的文件上传来品味面向对象的大局观(抽象类和功能类),如需转载请自行联系原博主。

时间: 2017-12-04

从一个很简单的文件上传来品味面向对象的大局观(抽象类和功能类)的相关文章

用VB6做一个简单的文件上传组件(一)

最近在单位做的一个项目里需要有文件上传的功能正好手头一本书的附赠光盘里有一个上传组件心中大喜.可惜随之便发现这是一个试用版不给钱就只能用50次太小气了好在头头催得不紧时间充裕干脆自己试着做一个既可长经验值又能长成就感不试白不试以下介绍的便是俺折腾了两天半捣鼓出来的一个只能说是雏形的玩意区区三十行代码大侠们不要笑俺哦这只是写给与俺一样好奇心强但经验值低的弟兄们看的.    文件上载所需的第一步当然是进入一个有"file"表单元素的页面具体就不说了大家都知道.但是若想做一个能够接受该文件并

mfc-用MFC做一个简单的文件上传的程序 ,上传过程中的暂停和继续怎么实现?

问题描述 用MFC做一个简单的文件上传的程序 ,上传过程中的暂停和继续怎么实现? rt 解决方案 能不能中断和继续取决于服务器怎么实现的,服务器必须具有分块接收上传文件的能力. 解决方案二: 你要把你的主要实现和主界面分开,就是用多线程,一个线程用于处理数据,主界面线程用于显示和接受用户操作,当用户按开始按钮时,开启处理线程,暂停时暂停处理线程,继续时再唤醒处理线程就行了. 解决方案三: java Web && 文件上传--简单实现

请教一个很简单的问题,如何在ASP.net页面上显示一个变量

问题描述 请教一个很简单的问题,如何在ASP.net页面上显示一个变量,比如登陆的时候,在固定位置显示***你好.如果不用response.write还有没有别的办法啊 解决方案 解决方案二:可以在你想放变量的地方放一个LABEL..赋值后显示就OK了解决方案三:好的,谢谢啦解决方案四:方法很多,常见的如楼上

android,一个很简单的demo,一运行就出错,谁能帮我看看怎么回事。

问题描述 android,一个很简单的demo,一运行就出错,谁能帮我看看怎么回事. eclipse上也没有错误提示,怎么运行不了.安装好就提示停止运行. 文件 解决方案 看logcat的日志,或者进入调试模式运行,一步步调 解决方案二: 亲,绑定布局空间是要通过布局管理者来获取的,不然就是空指针错误.具体如下 解决方案三: 用调试模式调试吧,很方便的. 解决方案四: 要看log日志的啊.看日志才知道哪里出错了, 解决方案五: fragment控件初始化的问题吧 解决方案六: fragment控

Python+django实现简单的文件上传_python

今天分享一下Django实现的简单的文件上传的小例子. 步骤 •创建Django项目,创建Django应用  •设计模型  •处理urls.py 以及views.py  •设计模板,设计表单  •运行项目,查看数据库 下面我们就一起来分别完成每一个小部分吧. 创建项目和应用 django-admin startproject Django_upload django-admin startapp app 添加一个名为upload的目录,待会要用哦. 然后记得在settings.py 中的INST

Django 实现简单的文件上传

今天分享一下Django实现的简单的文件上传的小例子. 步骤 创建Django项目,创建Django应用 设计模型 处理urls.py 以及views.py 设计模板,设计表单 运行项目,查看数据库 下面我们就一起来分别完成每一个小部分吧. 创建项目和应用 django-admin startproject Django_upload django-admin startapp app 添加一个名为upload的目录,待会要用哦. 然后记得在settings.py 中的INSTALLED_APP

objective-c-ios 想问一个很简单的异步问题

问题描述 ios 想问一个很简单的异步问题 [manager POST:@""https://www.baidu.com"" parameters:@{} success:^(AFHTTPRequestOperation *operation id responseObject) { NSLog(@""ok1""); } NSLog(@""ok2""); 很明显这段代码 如果打印的话 肯

一个经典的PHP文件上传类分享_php实例

文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码.为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中.帮助开发者在以后的开发中,通过编写几条简单代码就可以实现复杂的文件上传功能.对于基础薄弱的读者,只要会使用本类即可,而对一些喜欢挑战的朋友,可以尝试去读懂它,并能开发一个属于自己的文件上传类. 一.需求分析 要球自定义文件上传类,即在使用非常简便的前提下,又可以完成以下几项功能

数字-请教一个很简单的关于azure的技术问题

问题描述 请教一个很简单的关于azure的技术问题 请教一个很简单的技术问题:假设在windows azure中的网站,被浏览次数在管理后台哪里可以看到?其中"请求"数字是访问次数吗? 解决方案 azure没有这样的功能,你可以在你的页面上嵌入一段脚本,让第三方网站帮你统计.百度.google都有这样的站长统计. 解决方案二: 您好, 据我所知,Azure website service中可以在monitor(监视)面板中通过添加"Metric"将"Req