ueditor 文件上传的分析和总结
正式开始之前,先写两个常用又容易被我忘掉的文件和流相互转化的方法。
1,文件转流
- FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read);
- byte[] infbytes = new byte[(int)fs.Length];
- fs.Read(infbytes, , infbytes.Length);
- fs.Close();
- return infbytes;
2,流转文件
- FileStream fs = new FileStream("D:\inf.dlv",FileMode.Create,FileAccess.Write);
- fs.Write(infbytes, , inf.Length);
- fs.Close();
目前来说,自己这边网站有两个上传文件(尤其是图片)的方式,一个是通过aspx的文件上传控件直接在pageload里面接受和操作。一个是jquery上传的控件或者用<input type="file">直接上传,我觉得第二中比较具有普遍性,所以最先讨论第二种。
需求:1,接收用户上传的图片。 2,对图片格式和大小有要求。 3,图片需要压缩 。 4,压缩后的图片需要 裁剪,打水印。 5,存到以用户名为名的文件夹下的三个不同的文件夹。 6,以时间戳和随机数命名文件以防止重名。7,接收之后返回新的文件在服务器的相对路径。
第一步:前台页面的代码
有一点需要特别注意,在提交文件的表单中,action="uploadHandler.ashx"这个属性是不能缺少的,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行接下来的操作。(MIME是一种保证非ASCII码文件在internet上传播的规格)
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title></title>
- </head>
- <body>
- <form runat="server" id="form1" method="post" enctype="multipart/form-data" action="uploadHandler.ashx">
- <input name="file" type="file" id="upLoad" />
- <input name="action" type="hidden" value="uploadImage" />
- <input name="s" type="submit" />
- </form>
- </body>
- </html>
隐藏域是用来设置提交方式的,模拟多种提交,比如文件提交,图片提交,批量提交。
第二部,控制器,这里只写了一种配置,就是上传图片的配置
- public void ProcessRequest(HttpContext context)
- {
- Handler action = null;
- switch (context.Request["action"])
- {
- case "uploadimage":
- action = new UploadHandler(context, new UploadConfig()//从配置文件中读取配置
- {
- AllowExtensions = Config.GetStringList("imageAllowFiles"),
- PathFormat = Config.GetString("imagePathFormat"),
- SizeLimit = Config.GetInt("imageMaxSize"),
- UploadFieldName = Config.GetString("imageFieldName"),
- });
- break;
- default:
- break;
- }
- action.Process();
- }
然后是处理类的基类,是一个抽象类,关于抽象类,虚方法,还有比如base调用父类的构造函数这些都属于C#面向对象多态的内容,这个需要重新写一篇东西来总结。
- public abstract class Handler
- {
- public Handler(HttpContext context)
- {
- this.Request = context.Request;
- this.Response = context.Response;
- this.Context = context;
- this.Server = context.Server;
- this.Cookies = context.Request.Cookies;
- }
- /// <summary>
- /// 抽象出来的处理程序,必须被子类重写才能使用
- /// </summary>
- public abstract void Process();
- /// <summary>
- /// 给前台返回结果用的方法,
- /// </summary>
- /// <param name="response"></param>
- protected void WriteJson(object response)
- {
- string jsonpCallback = Request["callback"],
- json = JsonConvert.SerializeObject(response);
- if (String.IsNullOrWhiteSpace(jsonpCallback))
- {
- Response.AddHeader("Content-Type", "text/plain");
- Response.Write(json);
- }
- else
- {
- Response.AddHeader("Content-Type", "application/javascript");
- Response.Write(String.Format("{0}({1});", jsonpCallback, json));
- }
- Response.End();
- }
- public HttpRequest Request { get; private set; }
- public HttpResponse Response { get; private set; }
- public HttpContext Context { get; private set; }
- public HttpServerUtility Server { get; private set; }
- public HttpCookieCollection Cookies { get; set; }
- }
这个是真正的处理类uploadHandler
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using Newtonsoft.Json;
- using System.IO;
- namespace imageTest
- {
- public class UploadHandler : Handler
- {
- //把两个存储类当做本类的属性
- public UploadConfig UploadConfig { get; private set; }
- public UploadResult Result { get; private set; }
- /// <summary>
- /// 在派生类中访问基类的构造函数
- /// </summary>
- /// <param name="context"></param>
- /// <param name="config"></param>
- public UploadHandler(HttpContext context, UploadConfig config)
- : base(context)
- {
- this.UploadConfig = config;
- this.Result = new UploadResult() { State = UploadState.Unknown };
- }
- /// <summary>
- /// 正式的重写这个处理程序
- /// </summary>
- public override void Process()
- {
- byte[] uploadFileBytes = null;
- string uploadFileName = null;
- HttpPostedFile file = Request.Files[UploadConfig.UploadFieldName];
- uploadFileName = file.FileName;
- if (!CheckFileType(uploadFileName))
- {
- Result.State = UploadState.TypeNotAllow;
- WriteResult();
- return;
- }
- if (!CheckFileSize(file.ContentLength))
- {
- Result.State = UploadState.SizeLimitExceed;
- WriteResult();
- return;
- }
- //在所有的判断都结束之后,正式的对文件进行处理,这个没写
- }
- private void WriteResult()
- {
- this.WriteJson(new
- {
- state = GetStateMessage(Result.State),
- url = Result.Url,
- title = Result.OriginFileName,
- original = Result.OriginFileName,
- error = Result.ErrorMessage
- });
- }
- private string GetStateMessage(UploadState state)
- {
- switch (state)
- {
- case UploadState.Success:
- return "SUCCESS";
- case UploadState.FileAccessError:
- return "文件访问出错,请检查写入权限";
- case UploadState.SizeLimitExceed:
- return "文件大小超出服务器限制";
- case UploadState.TypeNotAllow:
- return "不允许的文件格式";
- case UploadState.NetworkError:
- return "网络错误";
- }
- return "未知错误";
- }
- private bool CheckFileSize(int size)
- {
- return size < UploadConfig.SizeLimit;
- }
- private bool CheckFileType(string filename)
- {
- var fileExtension = Path.GetExtension(filename).ToLower();
- return UploadConfig.AllowExtensions.Select(x => x.ToLower()).Contains(fileExtension);
- }
- }
- /// <summary>
- /// 上传配置对象,主要是用来读取后存放配置数据
- /// </summary>
- public class UploadConfig
- {
- /// <summary>
- /// 文件命名规则
- /// </summary>
- public string PathFormat { get; set; }
- /// <summary>
- /// 上传表单域名称
- /// </summary>
- public string UploadFieldName { get; set; }
- /// <summary>
- /// 上传大小限制
- /// </summary>
- public int SizeLimit { get; set; }
- /// <summary>
- /// 上传允许的文件格式
- /// </summary>
- public string[] AllowExtensions { get; set; }
- /// <summary>
- /// 文件是否以 Base64 的形式上传
- /// </summary>
- public bool Base64 { get; set; }
- /// <summary>
- /// Base64 字符串所表示的文件名
- /// </summary>
- public string Base64Filename { get; set; }
- /// <summary>
- /// 用户的用户名
- /// </summary>
- public string UserName { get; set; }
- public string WaterUrl { get;set;}
- public string SmallUrl { get; set; }
- public string
- }
- /// <summary>
- /// 上传结果对象,主要是用来存储程序的处理结果
- /// </summary>
- public class UploadResult
- {
- public UploadState State { get; set; }
- public string Url { get; set; }
- public string OriginFileName { get; set; }
- public string ErrorMessage { get; set; }
- }
- /// <summary>
- /// 枚举类型,程序的处理结果.
- /// </summary>
- ///
- public enum UploadState
- {
- Success = ,
- SizeLimitExceed = -,
- TypeNotAllow = -,
- FileAccessError = -,
- NetworkError = -,
- Unknown = ,
- }
- }
总结一下人家的设计思路,editor最先通过自己的js的配置文件初始化编辑器并且找到路径来访问control.ashx一般处理程序,ashx通过http访问的表单的action来判断是哪种操作,是上传文件还是图片还是读取等等,然后通过这个action,去config.json里面来读取具体的关于文件上传和下载等等配置,把这些配置通过配置对象加上httpcontext上下文一起传到文件上传控制类uploadHandler,uploadHandler继承自handler,所以构造函数可以调用基类的,process方法也是重写基类的抽象方法。
ueditor 文件上传的分析和总结的更多相关文章
- Java Web文件上传原理分析(不借助开源fileupload上传jar包)
Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web 最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...
- 1.5 webshell文件上传漏洞分析溯源(1~4)
webshell文件上传漏洞分析溯源(第一题) 我们先来看基础页面: 先上传1.php ----> ,好吧意料之中 上传1.png ----> 我们查看页面元素 -----> ...
- UEditor编辑器两个版本任意文件上传漏洞分析
0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...
- [转]UEditor编辑器两个版本任意文件上传漏洞分析
0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...
- 【代码审计】UKCMS_v1.1.0 文件上传漏洞分析
0x00 环境准备 ukcms官网:https://www.ukcms.com/ 程序源码下载:http://down.ukcms.com/down.php?v=1.1.0 测试网站首页: 0x0 ...
- 【代码审计】XYHCMS V3.5文件上传漏洞分析
0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...
- 【代码审计】JTBC(CMS)_PHP_v3.0 任意文件上传漏洞分析
0x00 环境准备 JTBC(CMS)官网:http://www.jtbc.cn 网站源码版本:JTBC_CMS_PHP(3.0) 企业版 程序源码下载:http://download.jtbc. ...
- 【代码审计】QYKCMS_v4.3.2 任意文件上传漏洞分析
0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...
- 【代码审计】BootCMS v1.1.3 文件上传漏洞分析
0x00 环境准备 BootCMS官网:http://www.kilofox.net 网站源码版本:BootCMS v1.1.3 发布日期:2016年10月17日 程序源码下载:http://w ...
随机推荐
- PHP生成随机水印图片
基于PHP的GD图形库,自己生成一张图片.仅限初识GD库,实例学习. 一.需求 网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介.因为课程的数量较大没有为所 ...
- flex与后台及页面间对象的传递
1.从flex中发送请求后,利用<s:RemoteObject/>启用回调方法,类似于jQuery的post函数: <fx:Declarations> <s ...
- Spring MVC 处理异常的3种方式
使用Spring MVC开发的博客网站时,遇到了如何处理业务层抛出的异常的问题,查阅到了spring官方博客-spring MVC中异常的处理,以下将会以登录模块为示例. 愚蠢的处理方式 处理异常遵循 ...
- 微信小程序已经开放个人开发者申请了,还不快上车?
前言 就在昨天(3月27号),微信公众号平台推送了文章"小程序新能力",这篇文章是广大开发者的福音.个人开发者可申请小程序!!! 小程序开放个人开发者申请注册,个人用户可访问微信公 ...
- 关于CO中的processRequest和processFormRequest的区别
在OAF开发中会有许多的CO,而一般情况下CO中的有两个基本的方法那就是processRequest和processFormRequest,processRequest是页面执行初始化的时候执行的方法 ...
- 我的iOS-App
1.PocketConfidential(密保箱) 简介 保存账号密码等敏感信息. 应用技术: sqlite.sqlcipher加密.AES数据加密.GCD https://itunes.apple. ...
- user-modify属性,让html标签可以编辑
其实这只是一个很小的需求,但是写着写着发现干货越来越多,所以特意给大家分享一下. 项目需要做一个类似QQ聊天输入的效果 有的同学说,这不是很简单吗?一开始我也这么感觉 :) 观察需求 1.整体固定在底 ...
- java基础之类与对象3
前面我的两篇文章主要介绍了将怎么将事物抽象为对象,以及对象的实例化(就是new一个对象).这篇文章里面我就讲下匿名对象... 还是就举之前的例子把,Car c = new Car();看到这个我们就知 ...
- html+css底部自动固定底部
前端在切图过程中,肯定遇见过这种情况. 页面结构由三个部分组成,头部.内容.底部. 当一个页面的内容没撑满屏幕时,底部是跟着内容而并列存在的. 这个时候如果是大屏的话,底部下面会有多余的空白区域,而网 ...
- asp.net SignalR 一对一聊天
<script src="~/Scripts/jquery-1.8.2.min.js"></script> <script src="~/S ...