图片上传插件localResizeIMG

下载地址:http://www.jq22.com/jquery-info3419

说明

在客户端压缩好要上传的图片可以节省带宽更快的发送给后端,特别适合在移动设备上使用。

按需加载(会根据对应设备自动异步载入JS文件,节省不必要带宽)

原生JS编写,不依赖例如jquery等第三方库,支持AMD or CMD规范。

如何获取

通过以下方式都可以下载:

执行npm i lrz(推荐)

执行bower install lrz

接着在页面中引入

<script src="./dist/lrz.bundle.js"></script>

如何使用

方式1:

如果您的图片来自用户拍摄或者上传的,您需要一个input file来获取图片。

<input id="file" type="file" accept="image/*" />

接着通过change事件可以得到用户选择的图片

document.querySelector('#file').addEventListener('change', function () {
lrz(this.files[0]).then(function (rst) {
// 处理成功会执行
}).catch(function (err) {
// 处理失败会执行
}).always(function () {
// 不管是成功失败,都会执行
});});

方式2:

如果您的图片不是来自用户上传的,那么也可以直接传入图片路径。

lrz('./xxx/xx/x.png').then(function (rst) {
// 处理成功会执行
}).catch(function (err){
// 处理失败会执行
}).always(function () {
// 不管是成功失败,都会执行
});

JQuery 处理

例子中给的是原生ajax的方式,下面是JQuery上传的方式

注意!!:使用 zepto 的朋友请用 原生 或 jquery代替,在某些 android 设备下用 zepto 会出现不发送 Content-Type 导致无法上传的BUG。 感谢 @Poised_flw

// 额外添加参数

rst.formData.append('fileLen', rst.fileLen);
$.ajax({
url: 'http://koa-upload.coding.io', // 这个地址做了跨域处理,可以用于实际调试
data: rst.formData,
processData: false,
contentType: false,
type: 'POST',
success: function (data) {
alert(JSON.stringify(data));
}});

首先引入三个库文件

<script type="text/javascript" src="__TMPL__Vote/assets/js/mobileFix.mini.js" ></script> 
<script type="text/javascript" src="__TMPL__Vote/assets/js/exif.js" ></script>
<script type="text/javascript" src="__TMPL__Vote/assets/js/lrz.js" ></script>


根据项目的不同使用不同的引入地址
<input id="uploaderFile0" name="img[]" type="file" data-add="0" onchange="changeFile(this)"/>
input:file框中使用时间onchang来触发压缩

var input = document.querySelector('input');
lrz(obj.files[0], {width: 350}, function (results) {
// 你需要的数据都在这里,可以以字符串的形式传送base64给服务端转存为图片。 console.log(results);
$("#img64base").val(results.base64);
$(obj).remove();
});

压缩后是base64字符串,把该字符串放到一个隐藏的input里,提交时只提交该字符串,删除input:file;
<input type="hidden" name="img64base[]" id="img64base0" value="" />
多文件提交的是数组img64base
 
php对传过来的字符串处理如下(多文件)

if($_POST['img64base'][0] !=""){//保存base64字符串为图片//匹配出图片的格式
foreach($_POST['img64base'] as $k=>$v){
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $v, $result)){
$type = $result[2];
$name=$this->fast_uuid();//图片的命名函数
$new_file = "Public/Mun/vote/{$name}.{$type}";
if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $v)))){//echo '新文件保存成功:', $new_file; $data['add_img'][$k] = $name.'.'.$type;
}
}
}
$_POST['img']=implode(',',$data['add_img']);
}else{
//$_POST['img']="";
$this->error('至少上传一张图片!');
}


上传过来的字符串前面多了data:image/jpeg;base64, 这几个字,去掉之后才能使用base64_decode函数转换成图片内容,然后用file_put_contents函数把图片能容放进一个图片文件里,注意图片的后缀名也是从data:image/jpeg;base64中获取的;
fast_uuid()是图片的命名函数,从网上找的,如下


/*
* 参数 suffix_len指定 生成的 ID 值附加多少位随机数,默认值为 3。
* @param int suffix_len
* @return string */
private function fast_uuid($suffix_len=3){//! 计算种子数的开始时间 $being_timestamp = time();
$time = explode(' ', microtime());
$id = ($time[1] - $being_timestamp) . sprintf('%06u', substr($time[0], 2, 6));
if ($suffix_len > 0) {
$id .= substr(sprintf('%010u', mt_rand()), 0, $suffix_len);
}
return $id;
}

点赞

发表评论