1.前端上传图片前压缩并预览
2019-08-10 本文已影响0人
一枼落知天下
利用canvas实现保存图片时,拼上二维码的需求
前端代码
<div class="fullface @if(isset($qyInfo['qyInfo']['front_url'])) on @endif">
<i></i>
<p><span>点击上传</span>营业执照</p>
<input class="uploadfile" type-img="front" name="mypic" type="file">
<img src="{{isset($qyInfo['qyInfo']['front_url'])?$qyInfo['qyInfo']['front_url']:''}}" id="front_url" alt="正面">
</div>
<script>
// 存储处理过的文件对象
var filelist = {};
//将base64转换为文件
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type:mime});
}
$(function () {
// 表单数据提交
$('.authentication_submit').click(function(){
//获取数据
var realname = $('#realname').val();
var realname_reg = /^[\u4E00-\u9FA5\uF900-\uFA2D]{2,6}$/;
var idcard = $('#idcard').val();
var copm_name = $('#copm_name').val();
// var idcard_reg = /^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/;
var front_url = $('#front_url').attr('src');
//验证身份证姓名
if(!realname_reg.test(realname)){
layer.msg('只能输入2-6位的姓名',{icon:0});
return;
}
//验证社会信用代码
if(idcard.length <=0){
layer.msg('请输入统一社会信用代码',{icon:0});
return;
}
if(idcard.length <=0){
layer.msg('请输入统一社会信用代码',{icon:0});
return;
}
//验证身份证正面
if(copm_name.length <=0){
layer.msg('请填写企业名称',{icon:0});
return;
}
if(front_url.length <=0){
layer.msg('请上传营业执照正面',{icon:0});
return;
}
var formData = new FormData();
formData.append('realname',realname);
formData.append('idcard',idcard);
formData.append('copm_name',copm_name);
formData.append('front_url',front_url);
formData.append('_token',$('#_token').val());
// 将文件添加到form表单里面,发送给后台
for (let key in filelist){
formData.append(key,filelist[key]);
}
// 将数据发送给后台~上传保存到七牛,保存实名信息
$.ajax({
url: '/userCenter/certification_qy_update' ,
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (data) {
var data = eval("(" + data + ")");
if(data.status ==1){
layer.msg(data.msg,{icon:1});
setTimeout(function () {
window.location.href = '/userCenter';
},1500)
}else {
layer.msg(data.msg,{icon:0});
}
},
error: function (data) {
layer.msg(data,{icon:0});
}
});
});
// 保存 压缩过的图片对象
$(".uploadfile").change(function (ev) {
var filename ;
var fileMaxSize = 1024*2;//2M
var quality = 0.62; // 图像质量
var _this = $(this);
var imgType = $(this).attr('type-img');
//判断 FileReader 是否被浏览器所支持
if (!window.FileReader) return;
var file = ev.target.files[0];
if (!file) {
layer.msg('上传失败,请重新操作!', {icon: 0, shade: [0.3, '#393D49'], shadeClose: true});
return;
}
filename = file.name;
//判断图片格式~
if (!file.type.match('image/*')) {
layer.msg('请选择格式为(jpg、png、jpeg)的图片文件!', {icon: 0, shade: [0.3, '#393D49'], shadeClose: true});
ev.target.value = ""; //显示文件的值赋值为空
return;
}
//file.size 文件字节数
if ((file.size / 1024) > fileMaxSize) {
layer.msg('请选择小于2M的图片!', {icon: 0, shade: [0.3, '#393D49'], shadeClose: true});
ev.target.value = ""; //显示文件的值赋值为空;
return;
}
var _image = new Image();
// 创建FileReader对象
var reader = new FileReader();
// 读取file对象,读取完毕后会返回result 图片base64格式的结果
reader.readAsDataURL(file);
reader.onload = function (e) {
_image.src = e.target.result
}
// 图片压缩,加水印,
_image.onload = function () {
if (this.complete) {
var canvas = document.createElement('canvas');
canvas.width = _image.width
canvas.height = _image.height
var ctx = canvas.getContext("2d");
ctx.drawImage(_image, 0, 0, _image.width, _image.height);
// ctx.font = "20px microsoft yahei";
// ctx.fillStyle = "rgba(255,255,255,0.5)";
// ctx.fillText('zhoushuai',30,30);
//base64文件
var dataUrl = canvas.toDataURL(file.type, quality);
//将base64转换为文件对象
var fileObj = dataURLtoFile(dataUrl,filename);
//全局对象保存文件
filelist[imgType] = fileObj;
canvas.toBlob(function (blob) {
var url = '';
if (window.createObjectURL !== undefined) {
url = window.createObjectURL(blob)
} else if (window.URL !== undefined) {
url = window.URL.createObjectURL(blob)
} else if (window.webkitURL !== undefined) {
url = window.webkitURL.createObjectURL(blob)
}
_this.next('img').attr('src', url);
_this.parent('div').addClass('on');
}, file.type, quality);
}
}
/*var _this = $(this);
var formData = new FormData();
var file =_this.context.files[0];
var _token = $('#_token').val();
formData.append('mypic',file);
formData.append('_token',_token);
$.ajax({
url: "/userCenter/uploadFile",
data: formData,
type: "Post",
dataType: "json",
contentType: false,
/!**
* 必须false才会避开jQuery对 formdata 的默认处理
* XMLHttpRequest会对 formdata 进行正确的处理
*!/
processData: false,
success: function (data) {
if(data.status ==1){
_this.next('img').attr('src',data.pic);
_this.parent('div').addClass('on');
}else {
alert(data.msg);
}
}
})*/
});
});
</script>
后端代码:
/**
* @author Jhou Shuai
* @desc 实名认证数据整理、证件照上传
*/
private function certDataHandle(&$data){
// 过滤掉不需要的数据。方便入库
unset($data['code']);
unset($data['_token']);
unset($data['front']);
unset($data['back']);
unset($data['hold']);
// 证件照上传
if(isset($_FILES)){
$img = new Image();
foreach ($_FILES as $key=>$file){
$result = $img->uploadImage($file);
if(isset($result['error'])){
$infos['status'] = 0;
$infos['msg'] = $result['error'];
die(json_encode($infos));
}
$index = $key."_url";
$data[$index] = $result;
}
}
}
public function certification_qy_update(Request $request){
//获取实名认证的参数
$user = Session::get('yd_user');
$data = $request->all();
//实名认证数据整理、证件照上传
$this->certDataHandle($data);
// 此处省略三千字...
}