首页 > web前端 > javascript/jquery > 移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传
网站建设、切图、企业建站、微信开发 联系QQ:404658186 tel:18716186715
2015
07-29

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

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

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

处理过程

  1. LocalResizeIMG压缩图片
  2. AjaxPost图片base64到后台
  3. 后台接收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; 
 $claerBase64 = explode(',', $base64_string);
 $image = base64_to_img( $claerBase64[1], $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,图片尺寸变大了,会失真),不知道大家有没有什么好的解决方法。

DEMO 下载

最后编辑:
作者:码农一号
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传》有 10 条评论

  1. 大海 说:

    图片上传以后,旋转了,有解决方法吗? case 3:
    ctx.rotate(180 * Math.PI / 180);
    ctx.drawImage(img, -resize.w, -resize.h, resize.w, resize.h);
    break;
    case 6:
    ctx.rotate(90 * Math.PI / 180);
    ctx.drawImage(img, 0, -resize.w, resize.h, resize.w);
    break;
    好像用这个

  2. 码农 说:

    测试了下,post部分环境是有限制的,只能发送一部分转码后的代码到服务端

  3. 52COVER 说:

    asp后台怎么写?

  4. 98765 说:

    LocalResizeIMG.js 文件中 第41行:w = obj.width || w;
    修改为 if(obj.width && obj.width < w){
    w = obj.width;
    }
    当图片实际尺寸小于width时,就不会拉伸默认使用原图

  5. 军哥 说:

    经过测试,发现360浏览器无法使用.其他浏览器在PC端都能正常

  6. 码农UFO 说:

    支持一下,挺不错的,节约了很多时间
    经修改,可以上传输出png,jpg,gif格式,并且图片小于400时不压缩图片大小!
    有需要的可Q 贰贰壹贰7陆0伍伍一

留下一个回复

你的email不会被公开。

*