ASP.NET MVC 网站开发总结(三) ——图片截图上传

本着简洁直接,我们就直奔主题吧,这里需要使用到一个网页在线截图插件imgareaselect(请自行下载)。

前台页面:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="css/imgareaselect-default.css" />
</head>
<body style="text-align:center;margin-top:200px;">
    <img id="preview_img" class="update-pic" src="img/default.jpg" />
    <form action="/User/UpdatePic" method="post" enctype="multipart/form-data" onsubmit="return Checkform()">
        <input type="hidden" id="x1" name="x1" value="0" />
        <input type="hidden" id="y1" name="y1" value="0" />
        <input type="hidden" id="x2" name="x2" value="0" />
        <input type="hidden" id="y2" name="y2" value="0" />
        <input type="file" name="pictureFile" id="pictureFile" style="display:none;" value="" onchange="SelectPicture();" />
        <div class="form-group text-center">
            <button type="button" class="templatemo-white-button" onclick="document.getElementById(‘pictureFile‘).click();">选择</button>
            <button type="submit" class="templatemo-blue-button">提交</button>
        </div>
    </form>
    <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="js/jquery.imgareaselect.pack.js"></script>
    <script type="text/javascript">
        var img = new Image();
        var imgWidth = 0;
        var imgHeight = 0;

        InitPicture();//初始化图片

        function Checkform()
        {
            //检查是否合法
            //...
            return false;
        }

        //选择和设置图片
        function SelectPicture() {
            var pic = document.getElementById("pictureFile");
            if (pic.value == "") {
                return false;
            }
            //筛选图片
            var strs = pic.value.split(".");
            var fileExt = strs[strs.length - 1].toLowerCase();
            if (fileExt != "jpg" && fileExt != "png") {
                alert("错误提示:选择的文件格式不正确!");
                return false;
            }
            //设置图片
            var url = getFileUrl("pictureFile");
            document.getElementById("preview_img").src = url;
            img.src = url;
            img.onload = function () {
                if (this.width > this.height) {
                    imgWidth = 280;
                    imgHeight = parseInt(280 * (this.height / this.width));
                    document.getElementById("preview_img").style.width = "280px";
                    document.getElementById("preview_img").style.height = imgHeight + "px";
                }
                else {
                    imgHeight = 280;
                    imgWidth = parseInt(280 * (this.width / this.height));
                    document.getElementById("preview_img").style.height = "280px";
                    document.getElementById("preview_img").style.width = imgWidth + "px";
                }
                InitPicture();
            };
        }

        //初始化图片
        function InitPicture() {
            $(‘#preview_img‘).imgAreaSelect({
                minWidth: 50,//最小宽度
                minHeight: 50,//最小高度
                aspectRatio: ‘1:1‘,//宽高之比1:1
                onSelectEnd: function (img, selection) {
                    $(‘input[name="x1"]‘).val(selection.x1);//绑定选中的值
                    $(‘input[name="y1"]‘).val(selection.y1);
                    $(‘input[name="x2"]‘).val(selection.x2);
                    $(‘input[name="y2"]‘).val(selection.y2);
                }
            });
        }

        //获取本地图片的url
        function getFileUrl(sourceId) {
            var url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
            if (navigator.userAgent.indexOf("MSIE") >= 1) { // IE
                url = document.getElementById(sourceId).value;
            } else if (navigator.userAgent.indexOf("Firefox") > 0) { // Firefox
                url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
            } else if (navigator.userAgent.indexOf("Chrome") > 0) { // Chrome
                url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
            }
            return url;
        }
    </script>
</body>
</html>

要使用imgareaselect插件上传文件主要要引入了imgareaselect-default.css、jquery.imgareaselect.pack.js以及jquery-2.1.1.min.js三个文件。

图片呈现在页面上进行了等比例的放缩(长或宽放缩为280px)。

页面效果图:

后台处理代码:

 //更新用户头像
        [HttpPost]
        public ActionResult UpdatePicture(int x1, int y1, int x2, int y2, HttpPostedFileBase pictureFile)
        {
            if (pictureFile != null && pictureFile.ContentLength > 0)
            {
                if (pictureFile.ContentLength > 5242880)
                {
                    return Content("<script>alert(‘错误提示:文件大小超出指定范围!‘);</script>");
                }
                string fileName = pictureFile.FileName.Split(‘\\‘).Last();
                string fileExt = fileName.Substring(fileName.LastIndexOf(‘.‘)).ToLower();
                if (fileExt == ".jpg" || fileExt == ".png")
                {
                    string path = Server.MapPath("~/Resources/HeadPicture");
                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }
                    fileName = DateTime.Now.ToFileTime().ToString() + Guid.NewGuid().ToString("N") + fileExt;
                    var picPath = Path.Combine(path, fileName);
                    pictureFile.SaveAs(picPath);//从客户端保存文件到本地

                    //检查裁剪图片是否合法并裁剪图片
                    var image = new WebImage(picPath);
                    double height = image.Height;
                    double width = image.Width;
                    if (width > height)
                    {
                        height = (int)(280 * (height / width));
                        width = 280;
                    }
                    else
                    {
                        width = (int)(280 * (width / height));
                        height = 280;
                    }
                    image.Resize((int)width, (int)height);//调整图片大小

                    var length = x2 - x1;
                    if (x1 >= 0 && x1 <= 280 && y1 >= 0 && y1 <= 280 && length >= 50 && length <= 280 && x1 + length <= width && y1 + length <= height)
                    {
                        image.Crop(y1, x1, (int)(height - y1 - length), (int)(width - x1 - length));
                        image.Save(picPath);
                        var logined = entity.Users.Find(Convert.ToInt32(User.Identity.Name));
                        logined.Picture = fileName;
                        entity.SaveChanges();
                        return Content("<script>alert(‘操作成功提示:成功更新照片!‘);</script>");
                    }
                    else
                    {
                        System.IO.File.Delete(picPath);
                        return Content("<script>alert(‘错误提示:上传的图片信息不合法!‘);</script>");

                    }
                }
                else
                {
                    return Content("<script>alert(‘错误提示:上传的文件格式不正确!‘);</script>");
                }
            }
            else
            {
                return Content("<script>alert(‘错误提示:上传的文件是空文件!‘);</script>");
            }
        }

上面代码是一个用户头像更新的代码,也是先将图片等比例放缩(长或宽放缩为280px),也前台页面上面的图片相对应,然后再进行裁剪。

第一次团队合作ASP.NET MVC 网站开发总结就到这里吧。

<我的博客主页>:http://www.cnblogs.com/forcheng/

时间: 2024-12-26 20:27:34

ASP.NET MVC 网站开发总结(三) ——图片截图上传的相关文章

ASP.NET MVC 网站开发总结(一)

历经一个多月的努力,工作室的门户网站终于结束了内部公测. 仔细算一下,大概把网站开发出1.0版本大概用了一个月的时间(主要是利用课余时间),其后大概用了十几天来测试.完善.改进,最终定型.感觉最有难度的既不是后台代码的编写,也不是前台页面的编写,而是将不同人编写的前台和后台很好的拼接起来(当然若是前台和后台都是同一个人做,当然不存在这个问题^_^).这也是自己第一次与工作室的伙伴共同完成一个网站.简单的总结一下,团队开发网站需要注意的地方以及收获吧!(其中我主要的任务是后台代码编写以及后台与前台

ASP.NET MVC 网站开发总结(四)——校友平台开发总结

又历经一个多月的努力,学校的一个校友平台项目也接近内测的尾声了,简单的总结一下这次的项目开发. 与上次做WingStudio工作室的门户网站相比,同样是团队开发,参与的人员多了一个,用的时间也差不多一个月,但从总体做的情况来看,这次比上一次要做的好得多(不论是页面的样式还是后台的模块化封装),这是进步也是必然,这次自己的任务仍旧是负责后台以及后台与前台的拼接. 总的来说,用ASP.NET MVC开发网站的效率是相当高的(而且也相当的好部署),特别是针对后台的开发,只要前期对页面的功能分析到位,立

ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化

首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化(Deserialization)对象的状态,重新创建该对象. 一般我们把Json的序列化与反序列化用在哪些地方呢?对于网站开发来说,一般我们会用Json来进行前台和后台的数据传递(常与Ajax一起使用),而这个过程就涉及到了Json的序列化与反序列化. 那么我们就来简单看

使用spring mvc+localResizeIMG实现HTML5端图片压缩上传

最近在做一个移动端HTML5的应用,使用到了上传功能,起初使用传统的上传方式上传手机拍照的照片,由于手机拍照出来的照片一般都是好几MB, 所以上传速度是非常慢的. 在网上找了很久找到了localResizeIMG压缩框架,感觉非常的实用,所以在此分享给大家. 第一步:下载localResizeIMG localResizeIMG放在github中的,地址是:https://github.com/think2011/localResizeIMG. 第二步:在web工程中导入localResizeI

ASP.NET MVC 网站开发总结(七)——C#操作图片:多张图的拼接(旋转)

其实用C#来操作图片的拼接就是在用Graphic画图.个人感觉还是挺有趣的,各种类库提供了丰富多彩的功能. 源代码(移植到一个简单的C#程序中,并没有放在ASP.NET项目中): using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace Test { class Program { static void Main(string[] args) { Image img

ASP.NET MVC 网站开发总结(五)——Ajax异步提交表单之检查验证码

首先提出一个问题:在做网站开发的时候,用到了验证码来防止恶意提交表单,那么要如何实现当验证码错误时,只是刷新一下验证码,而其它填写的信息不改变? 先说一下为什么有这个需求:以提交注册信息页面为例,一般注册都需要用户填一个验证码信息(防止机器恶意注册),并且这个验证码会提交到后台去进行比对,若是错了则不会检查其他提交信息而直接返回浏览器端提示验证码错误.若是简单地用form表单直接将数据提交到指定的url,当验证码填写错误的信息返回浏览器端的时候,不可避免整个页面都会重新刷新一次,这是用户所不想要

ASP.NET MVC网站开发流程

在创建网站之前,最重要的就是先规划网站架构.页面等工作.具体步骤如下: 1.需求分析——网站架构与功能 规划网站页面:页面层次.名称及简介 规划网站功能:功能简述 2.Model数据模型规划 根据网站各功能设计模型类 3.Controller控制器架构规划 根据各功能类别设计相应控制器,如会员功能,则应有注册.写入页面.登录.运行与注销等. 4.View创建视图页面 创建主版页面 添加视图 5.添加数据库与购物车功能 添加信息功能类:设置连接参数. 添加导览属性:直接通过导览属性快速取得信息.

ASP.NET MVC中,怎么使用jquery/ajaxForm上传文件

ajaxForm插件最好选择:jquery forms plugin. 以下为示例: Ajax.BeginForm @using (Ajax.BeginForm("YourAction", "YourController", new AjaxOptions() { HttpMethod = "POST" }, new { enctype = "multipart/form-data"})) { @Html.AntiForger

《微软Azure云计算开发实战(2):Azure部署ASP.NET MVC 网站

今天我们继续学习Azure的实战开发,<微软Azure云计算开发实战(2):Azure部署ASP.NET MVC 网站. 在你注册完Azure的使用账户以后,下面就可以登陆Azure管理界面了.因为我们后续的开发工作都要用到Azure的资源. Azure作为公有云平台,提供了几乎所有的平台支持,操作系统包括Linux Mac OS Windows,数据库主流的都支持,网站空间,数据库,虚拟主机操作系统 几乎都有.还有流媒体服务,Hadoop集成,Bigtable等. 我们先来学习一下如何部署一个