移动端html5图片上传方法【更好的兼容安卓IOS和微信】
之前的移动端上传的方法,有些朋友测试说微信支持不是很好,还有部分安卓机也不支持,其实我已经有了另一个方法,但是例子还没整理出来,而联系我的很多朋友需要,所以就提前先发出来了,并且做一个简单的说明,就不做一个demo了。
<!doctypehtml>
<html>
<head>
<metacharset="utf-8">
<metaname="viewport"content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0">
<title>图片压缩</title>
<style>
body{margin:0;padding:0;}
html{font-size:62.5%;}
.imgzip{padding:1em;}
.imgzip.itm{padding-bottom:1em;word-break:break-all;font-size:1.2rem;line-height:1.5em;}
.imgzip.itm.tit{margin-bottom:.5em;background-color:#e71446;color:#FFF;padding:.5rem1rem;border-radius:3px;}
.imgzip.itm.cnt{padding:1rem;}
.imgzip.itm.cntimg{display:block;max-width:100%;}
.imgziptextarea{width:100%;height:20em;}
</style>
</head>
<body>
<scriptsrc="http://code.jquery.com/jquery-1.8.3.js"></script>
<inputtype="file"accept="image/*;capture=camera"class="input">
<divclass="imgzip"></div>
<script>
document.addEventListener('DOMContentLoaded',init,false);
functioninit(){
varu=newUploadPic();
u.init({
input:document.querySelector('.input'),
callback:function(base64){
$.ajax({
url:"{:U('upload')}",
data:{str:base64,type:this.fileType},
type:'post',
dataType:'json',
success:function(i){
alert(i.info);
}
})
},
loading:function(){
}
});
}
functionUploadPic(){
this.sw=0;
this.sh=0;
this.tw=0;
this.th=0;
this.scale=0;
this.maxWidth=0;
this.maxHeight=0;
this.maxSize=0;
this.fileSize=0;
this.fileDate=null;
this.fileType='';
this.fileName='';
this.input=null;
this.canvas=null;
this.mime={};
this.type='';
this.callback=function(){};
this.loading=function(){};
}
UploadPic.prototype.init=function(options){
this.maxWidth=options.maxWidth||800;
this.maxHeight=options.maxHeight||600;
this.maxSize=options.maxSize||3*1024*1024;
this.input=options.input;
this.mime={'png':'image/png','jpg':'image/jpeg','jpeg':'image/jpeg','bmp':'image/bmp'};
this.callback=options.callback||function(){};
this.loading=options.loading||function(){};
this._addEvent();
};
/**
*@description绑定事件
*@param{Object}elm元素
*@param{Function}fn绑定函数
*/
UploadPic.prototype._addEvent=function(){
var_this=this;
functiontmpSelectFile(ev){
_this._handelSelectFile(ev);
}
this.input.addEventListener('change',tmpSelectFile,false);
};
/**
*@description绑定事件
*@param{Object}elm元素
*@param{Function}fn绑定函数
*/
UploadPic.prototype._handelSelectFile=function(ev){
varfile=ev.target.files[0];
this.type=file.type
//如果没有文件类型,则通过后缀名判断(解决微信及360浏览器无法获取图片类型问题)
if(!this.type){
this.type=this.mime[file.name.match(/\.([^\.]+)$/i)[1]];
}
if(!/image.(png|jpg|jpeg|bmp)/.test(this.type)){
alert('选择的文件类型不是图片');
return;
}
if(file.size>this.maxSize){
alert('选择文件大于'+this.maxSize/1024/1024+'M,请重新选择');
return;
}
this.fileName=file.name;
this.fileSize=file.size;
this.fileType=this.type;
this.fileDate=file.lastModifiedDate;
this._readImage(file);
};
/**
*@description读取图片文件
*@param{Object}image图片文件
*/
UploadPic.prototype._readImage=function(file){
var_this=this;
functiontmpCreateImage(uri){
_this._createImage(uri);
}
this.loading();
this._getURI(file,tmpCreateImage);
};
/**
*@description通过文件获得URI
*@param{Object}file文件
*@param{Function}callback回调函数,返回文件对应URI
*return{Bool}返回false
*/
UploadPic.prototype._getURI=function(file,callback){
varreader=newFileReader();
var_this=this;
functiontmpLoad(){
//头不带图片格式,需填写格式
varre=/^data:base64,/;
varret=this.result+'';
if(re.test(ret))ret=ret.replace(re,'data:'+_this.mime[_this.fileType]+';base64,');
callback&&callback(ret);
}
reader.onload=tmpLoad;
reader.readAsDataURL(file);
returnfalse;
};
/**
*@description创建图片
*@param{Object}image图片文件
*/
UploadPic.prototype._createImage=function(uri){
varimg=newImage();
var_this=this;
functiontmpLoad(){
_this._drawImage(this);
}
img.onload=tmpLoad;
img.src=uri;
};
/**
*@description创建Canvas将图片画至其中,并获得压缩后的文件
*@param{Object}img图片文件
*@param{Number}width图片最大宽度
*@param{Number}height图片最大高度
*@param{Function}callback回调函数,参数为图片base64编码
*return{Object}返回压缩后的图片
*/
UploadPic.prototype._drawImage=function(img,callback){
this.sw=img.width;
this.sh=img.height;
this.tw=img.width;
this.th=img.height;
this.scale=(this.tw/this.th).toFixed(2);
if(this.sw>this.maxWidth){
this.sw=this.maxWidth;
this.sh=Math.round(this.sw/this.scale);
}
if(this.sh>this.maxHeight){
this.sh=this.maxHeight;
this.sw=Math.round(this.sh*this.scale);
}
this.canvas=document.createElement('canvas');
varctx=this.canvas.getContext('2d');
this.canvas.width=this.sw;
this.canvas.height=this.sh;
ctx.drawImage(img,0,0,img.width,img.height,0,0,this.sw,this.sh);
this.callback(this.canvas.toDataURL(this.type));
ctx.clearRect(0,0,this.tw,this.th);
this.canvas.width=0;
this.canvas.height=0;
this.canvas=null;
};
</script>
</body>
</html>
这个也是把图片转成了base64去传送,个人不建议去用js改变图片的大小,建议裁切缩放还是PHP来做吧。
this.maxWidth=options.maxWidth||800;
this.maxHeight=options.maxHeight||600;
this.maxSize=options.maxSize||3*1024*1024;
this.input=options.input;
this.mime={'png':'image/png','jpg':'image/jpeg','jpeg':'image/jpeg','bmp':'image/bmp'};
这一部分是对上传图片的配置,应该可以看懂,可以自己去改
$.ajax({
url:"{:U('upload')}",
data:{str:base64,type:this.fileType},
type:'post',
dataType:'json',
success:function(i){
alert(i.info);
}
这部分是上传以后ajax发送base64码到php,base64码带有图片的说明字符串,所以得用正则去掉,然后base64解码保存到图片的文件中。并且返回地址即可
upload.php的内容
$str=$_POST['str'];
$type=$_POST['type'];
switch($type){
case'image/png':
$ext='.png';
break;
case'image/jpeg';
$ext='.jpeg';
break;
case'image/jpeg':
$ext='.jpg';
break;
case'image/bmp':
$ext='.bmp';
break;
default:
$ext='.jpg';
}
$file_path='./Uploads/'.date('Ymd').'/'.time().$ext;
if(!file_exists(dirname($file_path))){
mkdir(dirname($file_path),0777,true);
}
$img_content=str_replace('data:'.$type.';base64,','',$str);
$img_content=base64_decode($img_content);
$result=file_put_contents($file_path,$img_content);
更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。