localResizeIMG先压缩后使用ajax无刷新上传(移动端)


Posted in Javascript onAugust 11, 2015

下面通过文字说明和代码分析的方式给大家分享移动端图片上传之localResizeIMG先压缩后ajax无刷新上传,具体实现过程请看下文。

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实。所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器。

一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了。

处理过程

LocalResizeIMG压缩图片
AjaxPost图片base64到后台
后台接收base64并保存,返回状态
前台代码

重点,引用LocalResizeIMG.js(插件主体)及mobileBUGFix.mini.js(移动端的补丁)

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传</title>
<meta name="description" content="" />
<meta name="viewport" content="width=device-width , initial-scale=1.0 , user-scalable=0 , minimum-scale=1.0 , maximum-scale=1.0" />
<script type='text/javascript' src='js/jquery-2.0.3.min.js'></script>
<script type='text/javascript' src='js/LocalResizeIMG.js'></script>
<script type='text/javascript' src='js/patch/mobileBUGFix.mini.js'></script>
<style type="text/css">
 body{font-family:"微软雅黑"}
 .uploadbtn{ display:block;height:40px; line-height:40px; color:#333; text-align:center; width:100%; background:#f2f2f2; text-decoration:none; }
 .imglist{min-height:200px;margin:10px;}
 .imglist img{width:100%;}
</style>
</head>
<body>
<div style="width:500px;margin:10px auto; border:solid 1px #ddd; overflow:hidden; ">
 <input type="file" id="uploadphoto" name="uploadfile" value="请点击上传图片" style="display:none;" /> 
 <div class="imglist"></div> 
 <a href="javascript:void(0);" onclick="uploadphoto.click()" class="uploadbtn">点击上传文件</a>
</div>
<div style="text-align:center;margin-top:50px;">@ <a href="http://www.devdo.net/">码农小兵,专注web开发 欢迎投稿</a></div> 
</body>
</html>

Js部份,localResizeIMG及Ajax提交部份

使用方法

$('input:file').localResizeIMG({
   width: 400,//宽度
   quality: 1,//质量
   success: function (result) {
      result.base64/result.clearBase64
   }
});

localResizeIMG参数:

          width:缩略图宽度
          quality:图片质量,0—1,越大越好

localResizeIMG返回值

           result.base64:带图片类型的base64编码,可直接用于img标签的src,如“data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/…2wBDAAYEBQYFBAY”;

           result.clearBase64:不带图片类型的编码,如“/9j/4AAQSkZJRgABAQAAAQABAAD/…2wBDAAYEBQYFBAY”

$(document).ready(function(e) {
  $('#uploadphoto').localResizeIMG({
   width: 400,
   quality: 1,
   success: function (result) { 
     var submitData={
        base64_string:result.clearBase64, 
      }; 
    $.ajax({
      type: "POST",
      url: "upload.php",
      data: submitData,
      dataType:"json",
      success: function(data){
       if (0 == data.status) {
        alert(data.content);
        return false;
       }else{
        alert(data.content);
        var attstr= '<img src="'+data.url+'" alt="" />'; 
        $(".imglist").append(attstr); 
       }
      }, 
      complete :function(XMLHttpRequest, textStatus){
      },
      error:function(XMLHttpRequest, textStatus, errorThrown){ //上传失败 
        alert(XMLHttpRequest.status);
        alert(XMLHttpRequest.readyState);
        alert(textStatus);
      }
    }); 
   }
 });
});

保存文件

       在上面一步中,我们把result.clearBase64通过Ajax传入到upload.php中,接下来我们就要在upload.php中接收base64参数,把它转换成img文件保存来服务器中,并给出提示。

$base64_string = $_POST['base64_string'];
 $savename = uniqid().'.jpeg';//localResizeIMG压缩后的图片都是jpeg格式
 $savepath = 'images/'.$savename; 
 $image = base64_to_img( $base64_string, $savepath );
 if($image){
   echo '{"status":1,"content":"上传成功","url":"'.$image.'"}';
 }else{
   echo '{"status":0,"content":"上传失败"}';
 } 
 function base64_to_img( $base64_string, $output_file ) {
   $ifp = fopen( $output_file, "wb" ); 
   fwrite( $ifp, base64_decode( $base64_string) ); 
   fclose( $ifp ); 
   return( $output_file ); 
 }

不足之处

        localResizeIMG压缩后的图片模式都是jpeg,不能保证原有格式。

        当图片宽度小于localResizeIMG设置的width参数时,图片会被拉申,从而引起图片失真(比如width高为600,图片只在400px时,压缩后的图片就变成了600px,图片尺寸变大了,会失真),不知道大家有没有什么好的解决方法。

以上内容是本文介绍localResizeIMG先压缩后使用ajax无刷新上传的全部内容,希望大家喜欢。

Javascript 相关文章推荐
js实现点击注册按钮开始读秒倒计时的小例子
May 11 Javascript
jQuery的:parent选择器定义和用法
Jul 01 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
js操作数组函数实例小结
Dec 10 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
Jul 18 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
详解ES6 Promise对象then方法链式调用
Oct 20 Javascript
详解js常用分割取字符串的方法
May 15 Javascript
node.JS二进制操作模块buffer对象使用方法详解
Feb 06 Javascript
jQuery实现手风琴特效
Jan 11 jQuery
JavaScript设置表单上传时文件个数的方法
Aug 11 #Javascript
js限制文本框只能输入中文的方法
Aug 11 #Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 #Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
Aug 11 #Javascript
js模仿php中strtotime()与date()函数实现方法
Aug 11 #Javascript
JavaScript SHA512&amp;SHA256加密算法详解
Aug 11 #Javascript
js中 javascript:void(0) 用法详解
Aug 11 #Javascript
You might like
yii框架中的Url生产问题小结
2012/01/16 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
VBScript版代码高亮
2006/06/26 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
Python中关于使用模块的基础知识
2015/05/24 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
python实现猜单词小游戏
2020/05/22 Python
如何使用python操作vmware
2019/07/27 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
python 基于opencv操作摄像头
2020/12/24 Python
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
办理退休介绍信
2014/01/09 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
小学工作总结2015
2015/05/04 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL