目标实现:

  1、选择图片, 前端预览效果

  2、图片大于1.2M的时候, 对图片进行压缩

  3、以表单的形式上传图片

  4、图片删除

  

预览效果图:

代码说明:

1、input:file选择图片

<!-- html部分 -->
<ul id="preview" class="clear">
<li class="fl">
<img src="/images/audition/icon_upload.png">
<input id="fileImage" type="file" name="file[]" multiple />
<div class="num">0/4</div>
</li>
</ul>
var imgId = 0;  //图片id标志, 方便删除预览图片

/* 选择图片 */
function choosePic() {
$('#fileImage').change(function() {
var files = this.files,
len = $('#preview').find('.pic').length;
if (len + files.length > 4) {
showTip('最多只能上传4张图片哦~');
return;
}
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file.type.indexOf("image") == 0) {
if (file.size >= 1024 * 1024 * 3) {
showTip('图片大小过大,应小于3M');
} else {
showPic(file); //图片预览
}
} else {
showTip('文件"' + file.name + '"不是图片类型')
break;
}
}
});
}

2、图片预览(base64)

/* 渲染图片 */
function showPic(file) {
var html = '',
$wap = $('#preview'),
reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
var image_base64 = this.result; html = '<li class="fl pic" id="imgItem_' + imgId + '">' +
'<img src="' + image_base64 + '" alt="">' +
'<i class="del-img"></i>' +
'</li>';
imgId++;
$wap.append(html);
$('#fileImage').next().text($wap.find('.pic').length + '/4'); //图片压缩上传,大于1.2M压缩图片
if (file.size / 1024 > 1024 * 1.2) {
dealImage(image_base64, {
quality: 0.5
}, function(base64Codes) {
var bl = processData(base64Codes, file.type);
uploadPic(bl, imgId);
});
} else {
uploadPic(file, imgId);
}
}
}

3、图片压缩

/**
* 图片压缩(利用canvas)
* @param path 图片路径
* @param obj 压缩配置width,height,quality,不传则按比例压缩
* @param callback 回调函数
*/
function dealImage(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function() {
var that = this;
// 默认按比例压缩
var w = that.width,
h = that.height,
scale = w / h;
w = obj.width || w;
h = obj.height || (w / scale); //生成canvas
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
canvas.width = w;
canvas.height = h;
ctx.drawImage(that, 0, 0, w, h); // 默认图片质量为0.7
var quality = 0.7;
if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
quality = obj.quality;
} // 回调函数返回base64的值
var base64 = canvas.toDataURL('image/jpeg', quality);
callback(base64);
}
}

压缩后的文件是base64格式, 我们希望用file图片的形式上传

/* 将以base64的图片url数据转换为Blob */
function processData(dataUrl, type) {
var binaryString = window.atob(dataUrl.split(',')[1]),
arrayBuffer = new ArrayBuffer(binaryString.length),
intArray = new Uint8Array(arrayBuffer);
for (var i = 0, j = binaryString.length; i < j; i++) {
intArray[i] = binaryString.charCodeAt(i);
} var data = [intArray], blob; try {
blob = new Blob(data);
} catch (e) {
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if (e.name === 'TypeError' && window.BlobBuilder) {
var builder = new BlobBuilder();
builder.append(arrayBuffer);
blob = builder.getBlob(type);
} else {
showTip('版本过低,不支持图片压缩上传');
}
}
return blob;
}

4、图片上传

/* 上传图片 */
function uploadPic(file, id) {
var formData = new FormData();
formData.append('img', file);
$.ajax({
url: '/upload',
type: 'post',
dataType: 'json',
data: formData,
contentType: false,
processData: false,
success: function(res){
if(res.respCode == 1000) {
$('#imgItem_' + id).find('.del-img').attr('data-src', res.data.src);
}else {
showTip('文件上传失败!');
}
}
});
}

5、其他

function showTip(str) {
//TODO:信息提示
console.log(str);
}
/* 删除图片 */
function delPic() {
var $wap = $('#preview');
$wap.on('click', '.del-img', function() {
//TODO:从数据库删除图片
$(this).parent().remove();
$('#fileImage').next().text($wap.find('.pic').length + '/4');
});
}

源码:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>前端图片预览压缩上传</title>
<style>
.clear::after {
content: '';
clear: both;
display: block;
}
.fl {
float: left;
}
.list-img li {
position: relative;
margin-right: 10px;
list-style: none;
}
.list-img img {
display: inline-block;
width: 50px;
height:50px;
}
.list-img input {
position: absolute;
top: 0;
left: 0;
z-index: 10;
width: 50px;
height:50px;
opacity: 0;
}
.list-img i {
position: absolute;
top: 0;
right: 0;
width: 15px;
height: 15px;
background: url(../images/icon_del.png) no-repeat center;
background-size: 100%;
}
.list-img .num {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
text-align: center;
color: #999;
font-size: 12px;
}
</style>
</head>
<body>
<div class="list-img">
<ul id="preview" class="clear">
<li class="fl">
<img src="/images/icon_upload.png">
<input id="fileImage" type="file" name="file[]" multiple />
<div class="num">0/4</div>
</li>
</ul>
</div> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script>
var pageCtrl = {
imgId : 0, //图片id标志, 方便删除预览图片
maxNum : 4, //最多上传图片张数 /* 选择图片 */
_choosePic : function() {
var _self = this;
$('#fileImage').change(function() {
var files = this.files,
len = $('#preview').find('.pic').length;
if (len + files.length > _self.maxNum) {
_self._showTip('最多只能上传' + _self.maxNum + '张图片哦~');
return;
}
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file.type.indexOf("image") == 0) {
if (file.size >= 1024 * 1024 * 3) {
_self._showTip('图片大小过大,应小于3M');
} else {
_self._showPic(file); //图片预览
}
} else {
_self._showTip('文件"' + file.name + '"不是图片类型')
break;
}
}
});
}, /* 渲染图片 */
_showPic : function(file) {
var _self = this,
html = '',
$wap = $('#preview'),
reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
var image_base64 = this.result,
imgId = _self.imgId; html = '<li class="fl pic" id="imgItem_' + imgId + '">' +
'<img src="' + image_base64 + '" alt="">' +
'<i class="del-img"></i>' +
'</li>';
imgId++;
$wap.append(html);
$('#fileImage').next().text($wap.find('.pic').length + '/' + _self.maxNum); //图片压缩上传,大于1.2M压缩图片
if (file.size / 1024 > 1024 * 1.2) {
_self._dealImage(image_base64, {
quality: 0.5
}, function(base64Codes) {
var bl = _self._processData(base64Codes, file.type);
_self._uploadPic(bl, imgId);
});
} else {
_self._uploadPic(file, imgId);
}
}
}, /**
* 图片压缩(利用canvas)
* @param path 图片路径
* @param obj 压缩配置width,height,quality,不传则按比例压缩
* @param callback 回调函数
*/
_dealImage : function(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function() {
var that = this;
// 默认按比例压缩
var w = that.width,
h = that.height,
scale = w / h;
w = obj.width || w;
h = obj.height || (w / scale); //生成canvas
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
canvas.width = w;
canvas.height = h;
ctx.drawImage(that, 0, 0, w, h); // 默认图片质量为0.7
var quality = 0.7;
if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
quality = obj.quality;
} // 回调函数返回base64的值
var base64 = canvas.toDataURL('image/jpeg', quality);
callback(base64);
}
}, /* 将以base64的图片url数据转换为Blob */
_processData : function(dataUrl, type) {
var binaryString = window.atob(dataUrl.split(',')[1]),
arrayBuffer = new ArrayBuffer(binaryString.length),
intArray = new Uint8Array(arrayBuffer);
for (var i = 0, j = binaryString.length; i < j; i++) {
intArray[i] = binaryString.charCodeAt(i);
} var data = [intArray], blob; try {
blob = new Blob(data);
} catch (e) {
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if (e.name === 'TypeError' && window.BlobBuilder) {
var builder = new BlobBuilder();
builder.append(arrayBuffer);
blob = builder.getBlob(type);
} else {
_showTip('版本过低,不支持图片压缩上传');
}
}
return blob;
}, /* 上传图片 */
_uploadPic : function(file, id) {
var _self = this,
formData = new FormData();
formData.append('img', file);
$.ajax({
url: '/upload',
type: 'post',
dataType: 'json',
data: formData,
contentType: false,
processData: false,
success: function(res){
if(res.respCode == 1000) {
$('#imgItem_' + id).find('.del-img').attr('data-src', res.data.src);
}else {
_self._showTip('文件上传失败!');
}
}
});
}, /* 删除图片 */
_delPic : function() {
var _self = this,
$wap = $('#preview');
$wap.on('click', '.del-img', function() {
//TODO:从数据库删除图片
$(this).parent().remove();
$('#fileImage').next().text($wap.find('.pic').length + '/' + _self.maxNum);
});
}, _showTip : function(str) {
//TODO信息提示
console.log(str);
}, init: function() {
this._choosePic();
this._delPic();
}
}; $(function() {
pageCtrl.init();
});
</script>
</body>
</html> 完整代码

完整代码

参考文章:

https://www.cnblogs.com/007sx/p/7583202.html

H5图片预览、压缩、上传的更多相关文章

  1. jquery+html5+canvas实现图片 预览 压缩 上传

    javascirpt (function($){ $.fn.extend({ aiiUpload:function(obj) { if(typeof obj !="object") ...

  2. 原生js实现图片预览并上传

    最近主导的PC客户端网站重构工程告一段落,下一阶段开始给公司APP开发H5页面,技术栈是react.最近碰到一个需求:需要在H5页面上添加身份证照片,预览并上传.因为要兼容安卓4.4以下版本的手机,所 ...

  3. 基于“formData批量上传的多种实现” 的多图片预览、上传的多种实现

    前言 图片上传是web项目常见的需求,我基于之前的博客的代码(请戳:formData批量上传的多种实现)里的第三种方法实现多图片的预览.上传,并且支持三种方式添加图片到上传列表:选择图片.复制粘贴图片 ...

  4. H5-FileReader实现图片预览&Ajax上传文件

    图片预览 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  5. 前端图片预览,上传前预览,兼容IE7、8、9、10、11,Firefox,Chrome(学习到的知识)

    文章地址:http://www.cnblogs.com/rubylouvre/p/4597344.html 一.window.URL 在Chrome中,window.URL和window.webkit ...

  6. vue组件利用formdata图片预览以及上传《转载》

    转载修改 在项目中直接新建一个单文件页,复制一下代码即可       upload组件: <template> <div class="vue-uploader" ...

  7. vue组件利用formdata图片预览以及上传

    转载修改 在项目中直接新建一个单文件页,复制一下代码即可       upload组件: <template> <div class="vue-uploader" ...

  8. 用js实现预览待上传的本地图片

    js实现预览待上传的本地图片,代码如下: <form name="form5" id="form5" method="post" ac ...

  9. H5图片预览功能

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

随机推荐

  1. vue学习之六路由系统

    一.vueRouter实现原理 VueRouter的实现原理是根据监控锚点值的改变,从而不断修改组件内容来实现的,我们来试试不使用VueRouter,自己实现路由控制,如下代码: <!DOCTY ...

  2. latex 转word

    1:下载pandoc软件,支持多种文件格式互转. http://www.pandoc.org/installing.html#windows 2:下载zip包,解压,并将含有pandoc.exe的目录 ...

  3. AMR格式语音采集/编码/转码/解码/播放

    1.opencore-amr源码下载 https://sourceforge.net/projects/opencore-amr/files/opencore-amr/ 2.opencore-amr编 ...

  4. JSP表单提交与接收

    JSP表单提交与接收 在Myeclipse中新建web project,在webroot中新建userRegist1.jsp,代码如下 <%@ page contentType="te ...

  5. 微信小程序----团购或秒杀的批量倒计时实现

    效果图 实现思路微信小程序实现倒计时,可以将倒计时的时间进行每一秒的计算和渲染! JS模拟商品列表数据 goodsList:在 onLoad 周期函数中对活动结束时间进行提取:建立时间格式化函数 ti ...

  6. 主成分分析 PCA算法原理

    对同一个体进行多项观察时,必定涉及多个随机变量X1,X2,…,Xp,它们都是的相关性, 一时难以综合.这时就需要借助主成分分析 (principal component analysis)来概括诸多信 ...

  7. iOS设计规范HIG

    点击图标大小至少为这么大: Make it easy for people to interact with content and controls by giving each interacti ...

  8. winform dataGridView DataGridViewComboBoxColumn 下拉框事件代码

    有一个dataGridView ,有一列是DataGridViewComboBoxColumn .我用动态绑定,在绑定数据的时候.我们也给这一列绑定数据 在dataGridView的RowsAdded ...

  9. wcf 服务器无法处理请求由于内部错误

    The server was unable to process the request due to an internal error.  For more information about t ...

  10. pm2 观察报错时 pm2 start app.js --watch

    pm2 start app.js --watch[PM2][ERROR] Script already launched, add -f option to force re-execution