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

简介:

/// <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

}

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

目录
相关文章
|
移动开发 前端开发 JavaScript
HTML5 Canvas实现360度全景图
HTML5 Canvas实现360度全景图
259 1
|
弹性计算 容灾 安全
阿里云服务器如何购买?三种方式可买(图文举例流程)
阿里云服务器如何购买?三种方式可买(图文举例流程)2023阿里云服务器购买流程更新,选购云服务器有两个入口,一个是选择活动机,只需要选择云服务器地域、系统、带宽即可;另一个是在云服务器页面,自定义选择云服务器配置,这种方式购买云服务器较为复杂,需要选付费方式、地域及可用区、ECS实例规格、镜像、网络、公网IP、安全组等配置,阿里云百科来阿里云服务器购买流程指南2023新版教程:
534 0
阿里云服务器如何购买?三种方式可买(图文举例流程)
|
算法 Java
JVM垃圾回收算法,解析新生代为什么要有两个survivor区域
复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
382 0
|
SQL 存储 Oracle
Oracle性能调整的三把利剑--ASH,AWR,ADDM
Oracle性能调整的三把利剑--ASH,AWR,ADDM ASH (Active Session History)ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。
3280 0
|
1天前
|
云安全 人工智能 自然语言处理
|
6天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
318 116
|
8天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
631 55
Meta SAM3开源:让图像分割,听懂你的话
|
21天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~

热门文章

最新文章