jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)

上传图片本身是个基本的小功能,但是到了移动端就不那么简单了,相信找到这篇文章的你一定有深深的同感。

本文实例是:在(移动端)页面中点击图片,然后选择文件,然后保存。使用Asp.net

难点一:后台获取不到FileUpload的文件

解决方案:在 form 中添加 enctype="multipart/form-data" data-ajax="false"

难点二:ios图片上传后显示为横向图片(ios横拍照片无此问题;Android无此问题)

解决方案:加载exif.js,使用Orientation属性判断其旋转角度

完整代码如下:

1)页面头部加载exif.js,下载地址:http://code.ciaoca.com/javascript/exif-js/

<head runat="server">
    <script src="exif.js"></script>
</head>

2)页面HTML

<body>
    <form id="form1" runat="server" enctype="multipart/form-data" data-ajax="false">
    <div data-role="page" id="pageone">
        <div data-role="main" id="mainBody">
            <img src="img/errimg.jpg" onerror="this.src=‘/img/errimg.jpg‘" id="imgUserIco" runat="server" />       <asp:Button ID="Save" runat="server" OnClick="Save_Click" Text="保存" />
        </div>
    </div>

    <%--以下是Hidden--%>
    <asp:FileUpload ID="fileImg" runat="server" onchange="imgUserIco2Preview(this);" Style="display: none" />
    <asp:HiddenField ID="hidOrientation" runat="server" Value="1" />
    </form>
</body>    

3)点击图片的事件

$("#imgUserIco").on("click", function () {
        $("#fileImg").click();
});

4)上传控件中的图片路径改变后的事件

function imgUserIco2Preview(o) {
  if (o.files && o.files[0]) {
    var file = o.files[0];
    var Orientation = null;//旋转角度:1)0度,3)180度, 6)顺时针90度,8)逆时针90度
    var fileName = file.name;
    var fileType = fileName.substr(fileName.lastIndexOf("."), fileName.length - fileName.lastIndexOf(".")).toLowerCase();
    if (".gif.png.jpeg.jpg.bmp".indexOf(fileType) > -1) {
      //保存旋转角度
      EXIF.getData(file, function () {
        //alert(EXIF.pretty(this));
        EXIF.getAllTags(this);
        //alert(EXIF.getTag(this, ‘Orientation‘));
        Orientation = EXIF.getTag(this, ‘Orientation‘);
        $("#hidOrientation").val(Orientation);
      });

      var reader = new FileReader();
      reader.onload = function (e) {
        $("#imgUserIco").attr("src", e.target.result);
      }
      reader.readAsDataURL(file);
    }

  }
}

5)点击保存按钮后,后台代码


using System.IO;
using System.Drawing;

protected void Save_Click(object sender, EventArgs e)
        {
            try
            {
                BLL.TUser bllUser = new BLL.TUser();
                Model.TUser modUser = bllUser.GetModel(((Model.TUser)Session["USERModel"]).ID);

                if (this.fileImg.HasFile)
                {
                    //创建文件夹
                    if (!Directory.Exists(Server.MapPath("/") + "\\UploadFiles\\HeadIcon"))
                    {
                        Directory.CreateDirectory(Server.MapPath("/") + "\\UploadFiles\\HeadIcon");
                        if (!Directory.Exists(Server.MapPath("/") + "\\UploadFiles\\HeadIcon\\Img"))
                        {
                            Directory.CreateDirectory(Server.MapPath("/") + "\\UploadFiles\\HeadIcon\\Img");
                        }

                        if (!Directory.Exists(Server.MapPath("/") + "\\UploadFiles\\HeadIcon\\temp"))
                        {
                            Directory.CreateDirectory(Server.MapPath("/") + "\\UploadFiles\\HeadIcon\\temp");
                        }
                    }

                    //保存路径
                    string savePath = Server.MapPath("/") + "\\UploadFiles\\HeadIcon\\temp\\" + this.fileImg.FileName;

                    //压缩并保存图片
                    int maxWidth = 500;
                    System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(this.fileImg.FileContent);
                    int imgWidth = imgPhoto.Width;
                    int imgHeight = imgPhoto.Height;
                    if (imgWidth > maxWidth || imgHeight > maxWidth)
                    {
                        int newWidth = imgWidth >= imgHeight ? maxWidth : Convert.ToInt32(Math.Round(imgWidth * maxWidth / imgHeight * 1.0));
                        int newHeight = imgHeight >= imgWidth ? maxWidth : Convert.ToInt32(Math.Round(imgHeight * maxWidth / imgWidth * 1.0));

                        System.Drawing.Bitmap newImgPhoto = new System.Drawing.Bitmap(imgPhoto, newWidth, newHeight);
                        //iphone图片旋转
                        switch (this.hidOrientation.Value)
                        {
                            case "3": newImgPhoto.RotateFlip(RotateFlipType.Rotate180FlipNone); break;
                            case "6": newImgPhoto.RotateFlip(RotateFlipType.Rotate90FlipNone); break;
                            case "8": newImgPhoto.RotateFlip(RotateFlipType.Rotate270FlipNone); break;
                            default: break;
                        }
                        newImgPhoto.Save(savePath);
                    }
                    else
                    {
                        this.fileImg.PostedFile.SaveAs(savePath);
                    }
                    this.imgUserIco.Src = "/UploadFiles/HeadIcon/temp/" + this.fileImg.FileName;

                    //更新数据
                    modUser.HeadIcon = this.imgUserIco.Src;
                    modUser.LastDate = DateTime.Now;
                    if (bllUser.Update(modUser))
                    {
                        Session["USERModel"] = modUser;
                        Response.Redirect("PersonalDetials.aspx", false);
                    }
                }

            }
            catch
            {
                Response.Redirect("ErrorPage.aspx", false);
            }
        }

参考文献:http://blog.csdn.net/linlzk/article/details/48652635

时间: 2024-10-07 05:30:04

jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)的相关文章

使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 页面事件与 deferred

在系列的上一篇文章<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 事件详解>中,Kayo 介绍了除页面事件外的其他 jQuery Mobile 事件,而页面事件由于事件数较多,并且涉及 jQuery 中一个比较复杂的对象 deferred ,因此在本文中单独说明.jQuery Mobile 页面事件使用分为页面加载事件 (Page load events),页面跳转事件 (Page change events),页面显示/隐藏事件 (

jquery实现上传图片及图片大小验证、图片预览效果代码

jquery实现上传图片及图片大小验证.图片预览效果代码 上传图片验证 */ function submit_upload_picture(){     var file = $('file_c').value;     if(!/.(gif|jpg|jpeg|png|gif|jpg|png)$/.test(file)){            alert("图片类型必须是.gif,jpeg,jpg,png中的一种")        }else{      $('both_form')

jquery mobile的一些插件(图片滚动)

jquery mobile的一些插件(图片滚动) 1,photoswipe 网址:http://www.photoswipe.com/demo: http://www.photoswipe.com/latest/examples/04-jquery-mobile.html个人描述:在手机上操作很流畅,能自使用屏幕尺寸,竖屏显示效果很好,横屏图片太大了,也就是列数固定的原因. 2,Touch-Gallery 网址:http://neteye.github.com/touch-gallery.htm

自学JQuery Mobile的几个例子

JQuery Mobile是一个用于构建移动Web应用程序的框架,适用于主流的移动设备(智能手机.平板电脑),该框架利用了HTML5和CSS3技术减少了额外的脚本文件的编写.具体JQuery Mobile使用请转W3C页面:http://www.w3school.com.cn/jquerymobile/index.asp 例子:该例子创建了一个介绍海贼王故事的一系列页面 ex1.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra

jquery mobile 表单提交 图片/文件 上传

jquerymobile 下面 form 表单提交 和普通html没区别,最主要是 <form 要加一个 data-ajax='false' 否则 上传会失败 1  html代码 <!doctype html><html><head>    <meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8&qu

使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 事件详解

在前文<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础>中,Kayo 对 jQuery Mobile 事件的基础作出了一些说明,建议在阅读本文前首先阅读前文,这里 Kayo 再引用前文的重要内容. “jQuery Mobile 在基于本地事件上,创建了一系列的自定义事件,大部分事件是基于触摸设备的使用情况开发的,当然这些事件对于桌面环境也会有适当的处理,开发者可以使用 bind() 函数绑定到需要的页面对象中. 值得

jQuery Mobile 入门教程

原作:Getting started with jQuery Mobile   —— Matthew David http://www.cnblogs.com/yuzhongwusan/archive/2011/11/24/2261571.html 翻译:filod 译文:http://blog.filod.net/jquerymobile-2/295.html 转载声明:请注明原作.翻译以及译文链接. 你每天都会对着它讲话,和它玩游戏,用它看新闻——没错,它就是你裤兜里的智能手机.androi

为什么需要jQuery Mobile

先理清几个让人迷惑的几点 没有所谓的移动互联网,只有一个互联网 设计移动网站不需要什么特别处理 一个站点应当在所有设备(台式机.手机.电视)上都能运转 jQuery Mobile诞生的原因: 让设计师和开发者使用少量代码即可更容易地创建跨平台.可定制的移动互联网体验. jQuery Mobile是什么? jQuery Mobile是一个支持所有流行移动设备平台的统一的用户界面系统,基于坚如馨石的jQuery及jQuery UI.它轻量级的代码使用渐进增强方式构建,具有可伸缩.易更换主题的设计特点

经典收藏 50个jQuery Mobile开发技巧集萃

1.Backbone移动实例 这是在Safari中运行的一款Backbone移动应用程序.想开始体验移动开发,一个好的出发点就是关注这个应用程序的构建方式.先不妨在你的浏览器中查看该应用程序. 相关链接:http://bennolan.com/2010/11/24/backbone-jquery-demo.html 2.使用媒体查询来锁定设备 你可能会问如何使用CSS来锁定设备(根据屏幕尺寸).比如说,你想要为iPad设计两列布局.为智能手机设计单列布局.要做到这一点,最佳办法就是使用媒体查询.