首先介绍SWFUpload组件

SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术
为WEB开发者提供了一个具有丰富功能继而超越传统<input type="file" />标签的文件上传模式。

好了,不说废话直接看代码
Js代码

 1  var swfu;
 2         window.onload = function () {
 3             swfu = new SWFUpload({
 4                 // Backend Settings
 5                 upload_url: "/Image/upload", //提交上传的url
 6                 post_params: {
 7                     "ASPSESSID": "@Session.SessionID" //SessionID很重要,如果没有SessionID将无法上传,并且加载页面时Button都不会显示
 8                 },
 9                 // 上传文件设置
10                 file_size_limit: "2 MB", //大小
11                 file_types: "*.jpg",//格式
12                 file_types_description: "JPG Images",
13                 file_upload_limit: 0,    // Zero means unlimited
14                 //一系列事件 默认事件在Handler.js文件内
15                 swfupload_preload_handler: preLoad,
16                 swfupload_load_failed_handler: loadFailed,
17                 file_queue_error_handler: fileQueueError,
18                 file_dialog_complete_handler: fileDialogComplete,
19                 upload_progress_handler: uploadProgress,//上传过程
20                 upload_error_handler: uploadError,//上传异常
21                 upload_success_handler: cutImage, //上传成功
22                 upload_complete_handler: uploadComplete,
23                 // Button样式相关设置
24                 button_image_url: '@Url.Content("~/Content/js/swfuploadv250/images/XPButtonNoText_160x22.png")',
25                 button_placeholder_id: "spanButtonPlaceholder",//Button按钮ID
26                 button_width: 160,
27                 button_height: 22,
28                 button_text: '<span class="button">上传图片 <span class="buttonSmall">(2 MB Max)</span></span>',
29                 button_text_style: '.button { font-family: Helvetica, Arial, sans-serif;color:red; font-size: 14pt; } .buttonSmall { font-size: 10pt; }',
30                 button_text_top_padding: 1,
31                 button_text_left_padding: 5,
32                 // Flash文件(swfupload.swf) 路径设置
33                 flash_url: '@Url.Content("~/Content/js/swfuploadv250/swfupload.swf")',
34                 flash9_url: '@Url.Content("~/Content/js/swfuploadv250/swfupload_fp9.swf")',
35                 custom_settings: {
36                     upload_target: "divFileProgressContainer"  //展示信息框 的id
37                 },
38                 // 是否开启调试
39                 debug: false
40             });

View Code

Html

 1 <body>
 2     <div id="content">
 3         aaabbb
 4         <div id="swfu_container" style="margin: 0px 10px;">
 5             <div>
 6                 <span id="spanButtonPlaceholder"></span>
 7             </div>
 8             <div id="divFileProgressContainer" style="height: 75px;"></div>
 9             <div id="thumbnails"></div>
10         </div>
11     </div>
12     <div id="divImg" style="position:relative;overflow:hidden">
13         <div id="divCut" class="easyui-draggable" style="border:1px solid red;width:226px;height:198px;" data-options="onDrag:onDrag"></div>
14     </div>
15     <input type="button" value="头像截取" id="btnCut" />
16     <img id="cutImg" />
17 </body>

这时候页面效果

点击上传图片效果

控制器方法

 1 public ActionResult Upload()
 2         {
 3             //获得上传数据
 4             HttpPostedFileBase jpeg_image_upload = Request.Files["Filedata"];
 5             //保存图片
 6             string path = "../Images/temp.jpg";
 7             jpeg_image_upload.SaveAs(Request.MapPath(path));
 8             //获取图片大小
 9             UploadImage.Models.ImageViewData imgViewModel = new Models.ImageViewData();
10             //取得上传图片流
11             using (System.Drawing.Image original_image = System.Drawing.Image.FromStream(jpeg_image_upload.InputStream))
12             {
13                 imgViewModel.Path = path;
14                 imgViewModel.Width = original_image.Width;
15                 imgViewModel.Height = original_image.Height;
16             }
17             return Json(imgViewModel, JsonRequestBehavior.AllowGet);
18         }

Upload_success_handler:事件方法
主要步骤
1.根据服务端图片数据 设置用来显示图片div的背景src 和 大 小
2.保存src地址
1 //上传成功事件方法   上传相关信息  服务端返回的数据
2 function cutImage(file, serverData) {
3     var oJson = JSON.parse(serverData);
4     $("#divImg").css("backgroundImage", "url(" + oJson.Path + ")").css("width", oJson.Width + "px").css("height", oJson.Height + "px");
5     imgUrl = oJson.Path;
6 }
7 var imgUrl = "";

这是回调函数里的file参数信息,能用到的比较少。

creationdate: Wed Apr 09 2014 15:17:50 GMT+0800 (中国标准时间)
filestatus: -4
id: "SWFUpload_0_0"
index: 0
modificationdate: Thu Feb 27 2014 11:37:30 GMT+0800 (中国标准时间)
name: "1e6b388f8a513a5d6464f0b722e663aa.jpg"
post: Object
size: 101205
type: ".jpg"
uploadtype: 0
__proto__: Object

拖动用到了easyui的draggable组件 
如图
再次发送ajax请求给服务端(这次不需要用到swfupload组件)
只需要把选取框相对背景图的 x 和y轴 以及选取框的宽高即可
 1  //截图图片
 2             $("#btnCut").click(function () {
 3                 var $cut = $("#divCut");
 4                 var $divImg = $("#divImg");
 5                 var x = $cut.offset().left-$divImg.offset().left; //横坐标
 6                 var y = $cut.offset().top-$divImg.offset().left;//纵坐标
 7                 var width = $cut.width();//宽度
 8                 var height = $cut.height();//高度
 9                 //发送数据到服务端
10                 $.post("/Image/ImageCut", { "x": parseInt(x), "y": parseInt(y), "width": parseInt(width), "height": parseInt(height), "imgUrl": imgUrl },
11                     function (data) {
12
13                         $("#divImg").hide();
14                         $("#cutImg").attr("src", data);
15                     })
16             })

服务端代码

 1 public ActionResult ImageCut(FormCollection form)
 2         {
 3             //1:接受参数
 4             int x = int.Parse(form["x"]);
 5             int y = int.Parse(form["y"]);
 6             int width = int.Parse(form["width"]);
 7             int height = int.Parse(form["height"]);
 8             string imgUrl = form["imgUrl"];
 9             string imgPath = string.Empty;
10             using (Bitmap map = new Bitmap(width, height))//创建图片的大小与要截取图像的大小一致
11             {
12                 using (Graphics g = Graphics.FromImage(map))
13                 {
14                     //将之前上传的图片转成Image
15                     using (Image img = Image.FromFile(Request.MapPath(imgUrl)))
16                     {
17                                                 // 操作的图,    要画大小,   画哪一块, 度量单位
18                         g.DrawImage(img, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
19                         imgPath = "../Images/cuttemp.jpg";
20                         map.Save(Request.MapPath(imgPath));//将BitMap保存
21                     }
22                 }
23             }
24             return Content(imgPath);
25         }

转载于:https://www.cnblogs.com/Reaver/p/3847426.html

ASP.NET MVC下使用SWFUpload完成剪切头像功能相关推荐

  1. ASP.NET MVC下的四种验证编程方式[续篇]

    ASP.NET MVC下的四种验证编程方式[续篇] 原文:ASP.NET MVC下的四种验证编程方式[续篇] 在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET ...

  2. ASP.NET MVC下使用AngularJs语言(一):Hello your name

    新春节后,分享第一个教程. 是教一位新朋友全新学习ASP.NET MVC下使用AngularJs语言. 一,新建一个空的Web项目.使用NuGet下载AngularJs和jQuery. 二,配置Bun ...

  3. ASP.NET MVC下基于异常处理的完整解决方案

    ASP.NET MVC下基于异常处理的完整解决方案 参考文章: (1)ASP.NET MVC下基于异常处理的完整解决方案 (2)https://www.cnblogs.com/artech/archi ...

  4. Response.End()在Webform和ASP.NET MVC下的表现差异

    前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...

  5. 在ASP.NET MVC下实现树形导航菜单

    在需要处理很多分类以及导航的时候,树形导航菜单就比较适合.例如在汽车之家上: 页面主要分两部分,左边是导航菜单,右边显示对应的内容.现在,我们就在ASP.NET MVC 4 下临摹一个,如下: 实现的 ...

  6. ASP.NET MVC下的异步Action的定义和执行原理

    Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我 ...

  7. ASP.NET MVC下使用AngularJs语言(三):ng-options

    今天使用angularjs的ng-options实现一个DropDownList下拉列表. 准备ASP.NET MVC的model: public class MobilePhone{public i ...

  8. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  9. 在 Asp.NET MVC 中使用 SignalR 实现推送功能

    一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送 ...

最新文章

  1. 一:c#基本语法(2)(老田学习笔记)
  2. CTFshow 信息收集 web14
  3. boost log 能不能循环覆盖_如何在 JS 循环中正确使用 async 与 await
  4. 关于单点登录的简单原理和实现步骤
  5. 语音识别基本原理介绍之gmm-hmm续
  6. 如何下载有效的Flash离线安装包
  7. gentoo AR9285 BCM57780 安装驱动
  8. 极光推送指定用户推送_苹果推送iOS 12.1.4和macOS 10.14.3修复FaceTime 国内用户可酌情...
  9. CA/B论坛又出新动作了!代码签名证书最小密钥长度将于6月增强至3072位
  10. bigemap地图下载器与91位图有何区别
  11. PhotoShop PS 教程 100例
  12. PHP实现文章评论系统
  13. hadoop启动cgroups,centos6.5+hadoop2.7.2
  14. 单片机开发无线控制系列-手机无线超声波测距
  15. Java网络编程——基本网络支持
  16. Android之APP跳转到权限设置界面适配华为、小米、vivo等
  17. 范数(简单的理解)、范数的用途、什么是范数
  18. 了凡四训——改变命运之学
  19. python画蜡烛图_Python量化交易-绘制蜡烛图 !这个图不像你的钱哦!
  20. CAM 导入.rou钻孔文件时提示No header % found或者显示与实际尺寸偏差大

热门文章

  1. Web- HTML网页颜色大全
  2. 成大事必备9种能力、9种手段、9种心态
  3. Tarjan的求双连通分量算法
  4. 关于node.js和C交互的方法
  5. qhfl-5 redis 简单操作
  6. Apache的网页和安全优化
  7. css里calculate,calc() ---一个会计算的css属性
  8. 根据经纬度计算范围_地理计算专题(上)
  9. cs架构嵌入bs_车牌识别CS架构和BS架构详解
  10. 用c++做贪吃蛇_用世界公认的变态羊毛做袜子!不用插电恒温37°C,还能抑菌99%...