localResizeIMG先压缩后使用ajax无刷新上传(移动端)
下面通过文字说明和代码分析的方式给大家分享移动端图片上传之localResizeIMG先压缩后ajax无刷新上传,具体实现过程请看下文。
现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实。所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器。
一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了。
处理过程
LocalResizeIMG压缩图片
AjaxPost图片base64到后台
后台接收base64并保存,返回状态
前台代码
重点,引用LocalResizeIMG.js(插件主体)及mobileBUGFix.mini.js(移动端的补丁)
<!DOCTYPEHTML>
<html>
<head>
<metacharset="UTF-8">
<title>移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传</title>
<metaname="description"content=""/>
<metaname="viewport"content="width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0"/>
<scripttype='text/javascript'src='js/jquery-2.0.3.min.js'></script>
<scripttype='text/javascript'src='js/LocalResizeIMG.js'></script>
<scripttype='text/javascript'src='js/patch/mobileBUGFix.mini.js'></script>
<styletype="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;}
.imglistimg{width:100%;}
</style>
</head>
<body>
<divstyle="width:500px;margin:10pxauto;border:solid1px#ddd;overflow:hidden;">
<inputtype="file"id="uploadphoto"name="uploadfile"value="请点击上传图片"style="display:none;"/>
<divclass="imglist"></div>
<ahref="javascript:void(0);"onclick="uploadphoto.click()"class="uploadbtn">点击上传文件</a>
</div>
<divstyle="text-align:center;margin-top:50px;">@<ahref="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){
varsubmitData={
base64_string:result.clearBase64,
};
$.ajax({
type:"POST",
url:"upload.php",
data:submitData,
dataType:"json",
success:function(data){
if(0==data.status){
alert(data.content);
returnfalse;
}else{
alert(data.content);
varattstr='<imgsrc="'+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":"上传失败"}';
}
functionbase64_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无刷新上传的全部内容,希望大家喜欢。