HTML5 图片本地压缩上传插件「localResizeIMG」
移动应用中用户往往需要上传照片,但是用户上传的照片尺寸通常很大,而手机的流量却很有限,所以在上传前对图像进行压缩是很有必要的。
原生应用可以直接对文件进行处理,网页应用就没有这个优势了。不过 canvas 的出现给出一条新的思路,将图像按照比例绘制到画布上,最后将绘制完成的画布以 base64 编码方式发送到服务端,再由服务端进行解析还原成图片。
由于进行处理的过程较为复杂,于是 localResizeIMG 就孕育而生了,它简化了前端压缩图片的步骤,减轻了前端工程师的工作负担。Github:https://github.com/think2011/localResizeIMG
localResizeIMG 插件的优势:
- 经过大量测试,特别适合在移动设备上使用
- 会根据对应设备自动载入JS文件,节省宽带
- 基于原生 JavaScript 编写,支持 AMD 规范
localResizeIMG 的获取方式:
- GitHub:https://github.com/think2011/localResizeIMG
- NPM命令:npm install lrz
- BOWER:bower install lrz
======================前端代码=========================
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>localResizeIMG</title>
<!--引入JQuery 用于异步上传图片-->
<script type="text/javascript" src="dist/jquery-3.1.1.min.js"></script>
<!--引入 lrz 插件 用于压缩图片-->
<script type="text/javascript" src="dist/lrz.bundle.js"></script>
</head>
<body>
<input type="file" accept="image/jpeg" capture="camera">
</body>
<script>
$("input[type=file]").change(function () {
/* 压缩图片 */
lrz(this.files[0], {
width: 300 //设置压缩参数
}).then(function (rst) {
/* 处理成功后执行 */
rst.formData.append('base64img', rst.base64); // 添加额外参数
$.ajax({
url: "upload.php",
type: "POST",
data: rst.formData,
processData: false,
contentType: false,
success: function (data) {
$("<img />").attr("src", data).appendTo("body");
}
});
}).catch(function (err) {
/* 处理失败后执行 */
}).always(function () {
/* 必然执行 */
})
})
</script>
</html>
引入插件:<script type="text/javascript" src="dist/lrz.bundle.js"></script>
绑定事件:$("input[type=file]").change(function () {/* 压缩上传处理 */});
压缩图片:lrz(file, [options]);
file 通过 input:file 得到的文件,或者直接传入图片路径
[options] 这个参数允许忽略
width {Number} 图片最大不超过的宽度,默认为原图宽度,高度不设定时会适应宽度
height {Number} 图片的最大高度,默认为原图高度
quality {Number} 图片压缩质量,取值 0 - 1,默认为 0.7
fieldName {String} 后端接收的字段名,默认:file
返回结果:promise 对象
then(rst) 处理成功后执行
rst.formData 后端可处理的数据
rst.file 压缩后的file对象,如果压缩率太低,将会是原始file对象
rst.fileLen 生成后的图片的大小,后端可以通过此值来校验是否传输完整
rst.base64 生成后的图片base64,后端可以处理此字符串为图片,也可以直接用于 img.src = base64
rst.base64Len 生成后的base64的大小,后端可以通过此值来校验是否传输完整
rst.origin 也就是原始的file对象,里面存放了一些原始文件的信息,例如大小、日期等
异步上传:processData 和 contentType 必须设为 false,否则服务端不会响应
======================后端代码=========================
<?php
$base64_image_content = $_POST['base64img'];
$output_directory = './image'; //设置图片存放路径 /* 检查并创建图片存放目录 */
if (!file_exists($output_directory)) {
mkdir($output_directory, 0777);
} /* 根据base64编码获取图片类型 */
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
$image_type = $result[2]; //data:image/jpeg;base64,
$output_file = $output_directory . '/' . md5(time()) . '.' . $image_type;
} /* 将base64编码转换为图片编码写入文件 */
$image_binary = base64_decode(str_replace($result[1], '', $base64_image_content));
if (file_put_contents($output_file, $image_binary)) {
echo $output_file; //写入成功输出图片路径
}
HTML5 图片本地压缩上传插件「localResizeIMG」的更多相关文章
- 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...
- 纯原生js移动端图片压缩上传插件
前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于 ...
- CANVAS运用-对图片的压缩上传(仅针对移动浏览器)
最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等 ...
- uniapp小程序图片前端压缩上传
目录 1,前言 2,实现代码 1,前言 这次项目中做了一个图片上传,要求是大于2MB的就压缩成2MB一下的再上传,我这边利用了uniapp的文件接口,使用canvas做了一个压缩上传的功能,目前已上线 ...
- 前台图片Canvas压缩上传小结
需求来源:之前有个提交审核表单的业务,表单中含有大量附件图片,大约有20多张吧,为了省事,采用的同步上传,一次需要上传很多照片,本来单张图片限制为200KB,这样子总图片大小约为5MB左右,想想也可以 ...
- Html5+asp.net mvc 图片压缩上传
在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法 ...
- zyUpload界面绝佳、体验超棒的HTML5上传插件
一.为毛线开发它 经过了两个星期做出了两个基于HTML5的多文件上传插件,之前在做网站的时候用到文件上传这一个功能,但是大多说都是基于Flash的,正好最近HTML5很火,而且渐渐壮大起来,感觉搞前端 ...
- Js 之移动端图片上传插件mbUploadify
一.下载 https://pan.baidu.com/s/1NEL4tkHoK4ydqdMi_hgWcw 提取码:vx7e 二.Demo示例 <div class="weui_uplo ...
- 支持断点续传的文件上传插件——Huploadify-V2.0来了
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
随机推荐
- [LeetCode] Product of Array Except Self 除本身之外的数组之积
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...
- [LeetCode] Excel Sheet Column Number 求Excel表列序号
Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...
- [LeetCode] Unique Paths 不同的路径
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
- Css--深入学习之折角效果
本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 代码: /*建立一个带圆角的矩形,并使用线性渐变将其从左到底透 ...
- CentOS安装Redis详细教程
构建 Redis redis 目前没有官方 RPM 安装包,我们需要从源代码编译,而为了要编译就需要安装 Make 和 GCC. 如果没有安装过 GCC 和 Make,那么就使用 yum 安装. yu ...
- java-读取javabean类的set方法并设值
/** * 新反射实例化模型 * @param filenamepath * @return */ public static Object newIntence(String filenamepat ...
- ReactNative 使用微软的CodePush进行热更新,继续填坑
1.别被开发环境骗了 在我们开发react native的时候,一键运行工程,js改了,只要cmd+R就可以刷新了.然后会轻易以为真正app上线的时候也是一样,只要app一打开就是最新的. 其实!这是 ...
- Picture intermediate frame ----- increase smooth
By YutaiHou
- 认真研究一下Gradients css3(无聊笔记)(原)
渐变(gradients)分为2种: 线性渐变(Linear Gradients)- 向下/向上/向左/向右/对角方向 径向渐变(Radial Gradients)- 由它们的中心定义 红色框表示可重 ...
- 发送ajax请求时页面被刷新
浏览器默认会认为 button 的属性是submit.type='submit',会发生提交表单的默认行为,为button添加type="button"即可.