项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)


Posted in Javascript onJuly 28, 2016

第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下。

首先想到的是图片上传的问题。在通常表单数据都是ajax上传的情况下,为了上传图片而去使用form表单感觉很蠢。然后那时候也没有想到用jquery form插件。

后台的同事给的方案是用iframe里写一个form表单,然后上传图片之后自动提交表单,他将图片在服务器上的地址以跳转页url的一部分,我再来截取的方式。

方案一:iframe+form表单

<form action="/user/uploadIdCard.do" class="fileForm picUpload" enctype="multipart/form-data" method="post">
<input type="file" id="uploadPic" name="file">
<label for="uploadPic" id="fileBtn">
+
<img src="" />
</label>
<input type="text" name="turnUrl" class="turnUrl">
</form> 
$(".turnUrl").val(window.location.pathname);
$("#uploadPic").on('change', function(event) {
event.preventDefault();
$("form").submit();
});

在需要上传图片的界面引入iframe,在调用公用库里的iframe方法,获得图片的url并且把图片显示在iframe中

// 提取iframe里的路径
function iframe(el) {
var baseurl = "";
var code, filePath;
var place = $(el)[0].contentWindow.location.search;
console.log(place);
if (place) {
code = place.match(/code=\d+/)[0].substr(5);
if (place.match(/filepath=\S+/)) {
filePath = place.match(/filepath=\S+/)[0].substr(9);
}
$(el).contents().find(".tip").css('color', '#d0021b');
console.log(filePath);
switch (code) {
case "200":
$(el).contents().find(".tip").text('上传成功');
$(el).contents().find(".tip").css('color', '#55a012');
$(el).contents().find("#fileBtn>img").show().attr("src", baseurl + "/" + filePath);
return "/" + filePath;
case "206":
$(el).contents().find(".tip").text('文件过大');
break;
case "207":
$(el).contents().find(".tip").text('文件类型错误');
break;
case "208":
$(el).contents().find(".tip").text('系统错误');
}
}
}

方案二:后来发现这样的做法有两个问题,一个是用户发的图片太大,后台没有做压缩(后台的同事太忙了,为了迁就他们,就我们前端做压缩了)。

第二个是,上传图片成功之后,图片显示在iframe上,这样需要一定的反应时间,使用者有时候会反映图片传不上去,其实只是后台还没有返回……

于是决定用base64上传到后台的方式

<input type="file" id="uploadPic" name="file">
<label for="uploadPic" id="fileBtn">
+
<img class="showPic" src="" />
</label>
<span class="tip">请上传图片,大小在2M以内<br/>(图片类型可为jpg,jepg,png,gif,bmp)<br/>推荐图片比例为640*400</span>
<input type="text" name="turnUrl" class="turnUrl">
<canvas id="uploadImg" style="display:none"></canvas>

结构和原来差不多,只是多了一个canvas

$("#uploadPic").on('change', function(event) {
event.preventDefault();
console.log($(this)[0].files);
var file = $(this)[0].files[0];
if(file.size>2097152){
alert("上传图片请小于2M");
return false;
} if (!/image\/\w+/.test(file.type)) {
alert("文件必须为图片!");
return false;
}
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
createCanvas(this.result);
}
});
function createCanvas(src) {
var canvas = document.getElementById("uploadImg");
var cxt = canvas.getContext('2d');
canvas.width = 640;
canvas.height = 400;
var img = new Image();
img.src = src;
img.onload = function() {
// var w=img.width;
// var h=img.height;
// canvas.width= w;
// canvas.height=h;
cxt.drawImage(img, 0, 0,640,400);
//cxt.drawImage(img, 0, 0);
$(".showPic").show().attr('src', canvas.toDataURL("image/jpeg", 0.9));
$.ajax({
url: "/front/uploadByBase64.do",
type: "POST",
data: {
"imgStr": canvas.toDataURL("image/jpeg", 0.9).split(',')[1]
},
success: function(data) {
console.log(data);
$(".showPic").show().attr('data-url',"/"+ data.url);
}
});
}
}

1.首先是用的input的file文件的信息,判断文件大小file.size,以及文件是否为图片file.type

2.再通过html5的FileReader接口来获得这个图片的base64数据

3.将这个base64传入canvas中,作为一张图的src,这时候可以设置图片的分辨率大小,保证上传的图都是统一的分辨率。当然也可以按照图片原来的大小。

4.在ajax之前,把处理后的base64直接显示出来(这样用户就可以立刻看到自己上传的图片),再将 canvas.toDataURL("image/jpeg", 0.9).split(',')[1] (类型为image/jpeg,就可以用第二个参数来设置画质了)传到后台对应的接口

5.再将后台返回的url 绑在图片的data-url属性上,在ajax上交整个表单时获取这个data-url就好了,这样用户可以最快时间看到,而url其实还在ajax到后台的过程中

后记:这两个方案都有一个问题,会给后台上传很多冗余图片。不过后台的同事貌似没什么意见,?濉?br />

实际效果是这样的 http://www.qqchou.org/qqcweb/pages/photoIframe.html

以上所述是小编给大家介绍的项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jQuery的模仿新浪微博时间的组件
Oct 04 Javascript
用JavaScript实现类似于ListBox功能示例代码
Mar 09 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
May 19 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
May 26 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
解决layer弹出层中表单不起作用的问题
Sep 09 Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 #Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 #Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 #Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 #Javascript
AngularJS中的API(接口)简单实现
Jul 28 #Javascript
js 声明数组和向数组中添加对象变量的简单实例
Jul 28 #Javascript
AngularJS 输入验证详解及实例代码
Jul 28 #Javascript
You might like
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
《Python学习手册》学习总结
2018/01/17 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
python生成器推导式用法简单示例
2019/10/08 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
小学信息技术教学反思
2014/02/10 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
校运会加油稿大全
2015/07/22 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js