一般处理程序.ashx

code

在前面那篇有关智能提示的推荐文章中,作者用到了.ashx文件和jQuery。

说句实话,对于.ashx当时还真是第一次听说, ……

为了弥补自己知识上的缺陷,在网上恶补了一下,终于对此类文件有了一个初步的认识,特别是[http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html ]这篇文章写的非常好,对我很有启发。呵呵,又开始推荐文章了。

我发现,在股沟上搜索ashx,找到的文章可真多,但基本上都是抄自一篇“范文”,看来大家都有同样的习惯,就是看到可以帮助自己解决问题的文章,都是先摘抄下来再说,至于是否变成了自己的知识那就不一定了。记得上学的时候自己也有一个摘抄本,从报纸、杂志上看到好文章就剪下来贴到这里,现在书柜里还收藏有一本,都有些发黄了。在学校图书馆也常见到被偷偷开了天窗的报纸,看来有此爱好的人还真不少。现在多好啊,只要动几下鼠标就行了,连键盘都不用敲。其实那篇“范文”也只是泛泛而谈,并没有说到更本质的东西,如果看看上面那篇文章,对于这个问题可能会有更好的理解。

正如它的名字,“一般处理程序”,是用来处理一般的web请求的,所谓一般也可以理解为简单,也就是更接近底层的东西。说的通俗一点儿,aspx文件包装的非常好,处理请求变的很简单,而ashx文件没做啥包装,一切都要靠程序员自己来处理,所以更适合没有回滚需要的简单需求。在VS2008下有一个一般处理程序模板,而之前的版本则没有,但道理明白了,创建起来也很简单,也就是创建一个类文件,在其中实现IHttpHandler接口就行了。

看过ashx常用的几个经典示例,比如图片、二进制文件生成,比如RSS生成等等,想到以前都会遇到这些案例,基本采用aspx解决的。记得当时也有一闪 念间的困惑,用aspx做这个活,似乎总有些大才小用了。但也仅仅是一闪念,问题能解决,管它什么方法呢,黑猫白猫,抓住老鼠的就是好猫,一般人都会有 这样的心理,特别是对于我们这些做应用开发的,更不太喜欢也似乎没有精力去关心底层一点的东西。但现在明白了,的确有更好的方案。

### 使用 `ajaxfileupload.js` 与 `.ashx` 一般处理程序实现图片上传 实现图片上传功能可以通过 `ajaxfileupload.js` 插件与 ASP.NET 中的 `.ashx` 一般处理程序相结合,实现无刷新上传。该方法利用 jQuery 的异步请求机制,将文件上传过程隐藏在后台执行,提升用户体验[^1]。 #### 前端页面布局与文件上传触发 在 HTML 页面中添一个文件输入框和按钮,并通过 `ajaxfileupload.js` 的 `$.ajaxFileUpload` 方法触发上传操作: ```html <input type="file" id="fileInput" name="fileInput" /> <button id="uploadBtn">上传图片</button> <div id="preview"></div> ``` #### 使用 `ajaxfileupload.js` 发起异步请求 通过 jQuery 的 `ajaxFileUpload` 方法,将文件异步上传到服务器。注意设置 `fileElementId` 为文件输入框的 ID,并指定服务器端处理程序的 URL: ```javascript $("#uploadBtn").click(function () { $.ajaxFileUpload({ url: '/UploadHandler.ashx', // 指向一般处理程序 secureuri: false, fileElementId: 'fileInput', dataType: 'json', success: function (data, status) { if (data.success) { var img = $('<img>').attr('src', data.url); $('#preview').append(img); } else { alert('上传失败: ' + data.message); } }, error: function (data, status, e) { alert(e); } }); }); ``` #### 服务器端 `.ashx` 一般处理程序实现 创建一个名为 `UploadHandler.ashx` 的一般处理程序,用于接收上传的文件并返回处理结果: ```csharp public class UploadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "application/json"; try { if (context.Request.Files.Count > 0) { HttpPostedFile file = context.Request.Files[0]; string fileName = Path.GetFileName(file.FileName); string ext = Path.GetExtension(fileName).ToLower(); string[] allowedExts = { ".jpg", ".jpeg", ".png", ".gif", ".bmp" }; if (!allowedExts.Contains(ext)) { context.Response.Write("{\"success\":false, \"message\":\"不允许的文件类型\"}"); return; } string savePath = context.Server.MapPath("~/Uploads/" + fileName); file.SaveAs(savePath); string imageUrl = "/Uploads/" + fileName; context.Response.Write("{\"success\":true, \"url\":\"" + imageUrl + "\"}"); } else { context.Response.Write("{\"success\":false, \"message\":\"没有上传文件\"}"); } } catch (Exception ex) { context.Response.Write("{\"success\":false, \"message\":\"" + ex.Message + "\"}"); } } public bool IsReusable => false; } ``` 该处理程序首先检查是否有上传的文件,然后验证文件扩展名是否符合图片类型要求。若验证通过,则将文件保存到服务器指定路径,并返回图片的 URL 地址;若验证失败或上传过程中发生异常,则返回错误信息。 #### 安全性与文件类型验证 为了防止恶意文件上传,服务器端应严格限制允许上传的文件类型。除了前端限制外,后端验证是必须的,以防止绕过客户端限制的情况。通过检查文件扩展名并与白名单比对,可以有效控制上传内容[^1]。 #### 完整性与用户体验优化 为提升用户体验,可以在上传过程中添载动画,并在上传完成后立即显示图片预览。同时,确保上传路径具有适当的权限设置,以避免文件写入失败。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值