使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

ajax上传主要使用了 var reader = new FileReader() 此方法

js图片压缩主要是利用canvas进行的

源码:

  1. /**
  2. * js使用form上传图片,支持本地预览选中的图片,支持携带自定义参数
  3. * @param {string} params.previewImgId 预览图片控件id,可以预览上传图片
  4. * @param {string} params.url 提交上传的url
  5. * @param {function} params.success 上传接口的回调函数
  6. * @param {boolean} params.params 上传时提交的其它参数 有几个传几个,系统会把 previewImgId url success 这三个参数过滤后的其它参数传给服务器
  7. 使用示例:
  8. <img src="" id="yulan">
  9. <div onclick="shangchuan()">上传</div>
  10. function shangchuan(){
  11. jsUploadImage({"diyparam":"1111","diyparam1":"222","previewImgId":"yulan","url":"user.php?act=photosave","success":function(data){
  12. console.log(data);
  13. }})
  14. };
  15. */
  16. function jsUploadImage(params){
  17. //初始化数据
  18. params.previewImgId = params.previewImgId || "";
  19. params.url = params.url || "";
  20. params.success = params.success || "";
  21.  
  22. //创建file上传控件
  23. if(document.getElementById("imgFile")==null){
  24. var inputEle=document.createElement("input"); //创建input
  25. inputEle.id="imgFile";
  26. inputEle.type="file";
  27. inputEle.accept="image/png,image/jpeg,image/jpeg,DCIM/*;capture=camera";
  28. inputEle.style="display:none;";
  29. inputEle.onchange = function(){
  30. showPhoto()
  31. };
  32. inputEle.multiple = false;
  33. document.body.appendChild(inputEle);
  34. }
  35. var imgFile = document.getElementById("imgFile");
  36. imgFile.click();
  37.  
  38. //选中文件后的预览图片
  39. function showPhoto(){
  40. //文件对象
  41. var file = document.getElementById("imgFile").files[0];
  42.  
  43. //读取后辍,判断是否允许的文件
  44. var fileSuffix = file.name.substring(file.name.length-4);
  45. var allowFile = ".jpg|.png|.gif";
  46. if(allowFile.indexOf(fileSuffix.toLowerCase())==-1) {
  47. alert("请使用"+allowFile+"后辍的文件");
  48. return false;
  49. }
  50.  
  51. //如果传了显示控件的id,显示本地预览
  52. var reader = new FileReader()
  53. reader.readAsDataURL(file);
  54. reader.onload = function(e){
  55. var imgBase64Data = e.target.result;
  56.  
  57. //显示预览
  58. if("" != params.previewImgId) document.getElementById(params.previewImgId).src = imgBase64Data;
  59.  
  60. //如果不压缩直接上传
  61. //savePhoto(imgBase64Data)
  62.  
  63. //对图片进行缩小处理,然后再上传
  64. compressPhoto(imgBase64Data,1000,1000,function(imgBase64DataBack){
  65. //提交服务保存数据
  66. savePhoto(imgBase64DataBack)
  67. });
  68.  
  69. }
  70.  
  71. }
  72.  
  73. //提交数据
  74. function savePhoto(base64Data){
  75. var formData = new FormData();
  76.  
  77. //加入其它参数
  78. for(var key in params){
  79. if(key!="previewImgId" && key!="url" && key!="success" ){
  80. formData.append(key, params[key]);
  81. }
  82. }
  83. //加入文件参数 利用base64
  84. formData.append("imgFile",encodeURIComponent(base64Data));
  85. //加入文件参数 file控件上传 , 但这种试就不支持对图片压缩了,所以手机端不采用这种方式
  86. //formData.append('imgFile', file);
  87.  
  88. //ajax上传
  89. $.ajax({
  90. url:params.url,
  91. type: 'POST',
  92. cache: false,
  93. dataType:"json",
  94. data: formData,
  95. processData: false,
  96. contentType: false
  97. }).done(function(res) {
  98. if(params.success!=""){
  99. params.success(res);
  100. }
  101. }).fail(function(res) {
  102. alert("上传失败");
  103. });
  104. }
  105.  
  106. }
  107.  
  108. /**
  109. * js利用canvas对图像进行压缩处理
  110. * @param {string} imgBase64Data 图像base64数据
  111. * @param {string} maxWidth 最大高度
  112. * @param {function} maxHeight 最大宽度
  113. * @param {boolean} fun 回调函数,参数为处理后的图像数据
  114. 使用示例:
  115. compressPhoto(imgBase64Data,maxWidth,maxHeight,function(imgBase64Data){
  116. //返回图片数据后的处理
  117. })
  118. */
  119. function compressPhoto(imgBase64Data,maxWidth,maxHeight,fun){
  120. var img = new Image();
  121.  
  122. // 缩放图片需要的canvas
  123. var canvas = document.createElement('canvas');
  124. var context = canvas.getContext('2d');
  125.  
  126. // base64地址图片加载完毕后
  127. img.onload = function () {
  128. // 图片原始尺寸
  129. var originWidth = this.width;
  130. var originHeight = this.height;
  131. // 目标尺寸
  132. var targetWidth = originWidth, targetHeight = originHeight;
  133. // 图片尺寸超过400x400的限制
  134. if (originWidth > maxWidth || originHeight > maxHeight) {
  135. if (originWidth / originHeight > maxWidth / maxHeight) {
  136. // 更宽,按照宽度限定尺寸
  137. targetWidth = maxWidth;
  138. targetHeight = Math.round(maxWidth * (originHeight / originWidth));
  139. } else {
  140. targetHeight = maxHeight;
  141. targetWidth = Math.round(maxHeight * (originWidth / originHeight));
  142. }
  143. }
  144.  
  145. // canvas对图片进行缩放
  146. canvas.width = targetWidth;
  147. canvas.height = targetHeight;
  148. // 清除画布
  149. context.clearRect(0, 0, targetWidth, targetHeight);
  150. // 图片压缩
  151. context.drawImage(img, 0, 0, targetWidth, targetHeight);
  152.  
  153. var base=canvas.toDataURL("image/jpeg",0.7);//canvas转码为base64
  154. fun(base);//返回处理
  155. };
  156.  
  157. img.src = imgBase64Data;
  158. }

使用示例:

  1. <img src="" id="yulan">
  2. <div onclick="shangchuan()">上传</div>
  3. <script type="text/javascript">
  4. function shangchuan(){
  5. jsUploadImage({"diyparam":"1111","diyparam1":"222","previewImgId":"yulan","url":"user.php?act=photosave","success":function(data){
  6. console.log(data);
  7. }})
  8. };
  9. </script>

来源:jsfun.cn
http://www.jsfun.cn/#codecollect

使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器的更多相关文章

  1. 小程序踩坑记录-上传图片及canvas裁剪图片后上传至服务器

    最近在写微信小程序的上传图片功能,趟过了一些坑记录一下. 想要满足的需求是,从手机端上传图片至服务器,为了避免图片过大影响传输效率,需要把图片裁剪至适当大小后再传输 主要思路是,通过wx.choose ...

  2. 支持无限加载的js图片画廊插件

    natural-gallery-js是一款支持无限加载的js图片画廊插件.该js图片画廊支持图片的懒加载,可以对图片进行搜索,分类,还可以以轮播图的方式来展示和切换图片. 使用方法 在页面中引入下面的 ...

  3. MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器

    MVC图片上传.浏览.删除   1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...

  4. 前端借助dom-to-image把HTML转成图片并通过ajax上传到服务器

    之前接到了一个任务,把jsp中的table转成一个图片,保存在指定文件夹并显示在前端. 我的思路是:一.引用第三方js在前端把table转成图片 二.通过ajax把图片上传到服务器,保存在指定文件夹 ...

  5. HTML5 本地裁剪图片并上传至服务器(转)

    很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...

  6. HTML5裁剪图片并上传至服务器实现原理讲解

    HTML5裁剪图片并上传至服务器实现原理讲解   经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...

  7. js插件---IUpload文件上传插件(包括图片)

    js插件---IUpload文件上传插件(包括图片) 一.总结 一句话总结:上传插件找到真正上传位置的代码,这样就可以知道整个上传插件的逻辑了, 找资料还是github+官方 1.如何在js中找到真正 ...

  8. layui框架图片上传至服务器

    注意:只可用于数据量较小的项目,数据量庞大的项目不要用这个,否则会造成图片数量庞大,至服务器运行速度变慢或瘫痪 HTML代码 //前端使用的是layui框架<div class="la ...

  9. 项目分享五:H5图片压缩与上传

    一.简介 图片的压缩与上传,是APP里一个很常用的功能.我们来年看 ChiTuStore 是怎样做的.相关文件 App/Module/User/UserInfo.html,App/Module/Use ...

随机推荐

  1. javascript学习总结一

    1. 变量提升hoisting 变量提升的意思是在一个变量作用域里定义的变量的声明会被提升到作用域的顶部,这是变量只会被声明,不会被初始化复制,而是undefined. 代码如下: function ...

  2. git checkout+文件丢失

    坑:不知什么时候, 应该是初学git的时候, 在桌面git init了一下, 这次忘记切目录直接在桌面git checkout了, 导致文件丢失了. 解决: 简单复原: git reflog # 查看 ...

  3. 1025InnoDB log file 设置多大合适

    转自 http://blog.csdn.net/langkeziju/article/details/51094289 数据库的东西,往往一个参数就牵涉N多知识点.所以简单的说一下.大家都知道inno ...

  4. Redis Cluster 4.0 on CentOS 6.9 搭建

    集群简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需 ...

  5. Django REST framework+Vue 打造生鲜超市(九)

    十.购物车.订单管理和支付功能 10.1.添加商品到购物车 (1)trade/serializer.py # trade/serializer.py __author__ = 'derek' from ...

  6. pyquery 的用法 --爬虫解析库

    如果你对Web有所涉及,如果你比较喜欢用CSS选择器,如果你对jQuery有所了解,那么这里有一个更适合你的解析库--pyquery. 接下来,我们就来感受一下pyquery的强大之处. 1. 准备工 ...

  7. HashMap 你真的了解吗?

    HashMap深入解析及详细介绍 一. hashmap简介 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特 ...

  8. 一.Kylin的伪分布式安装

    一.伪分布式安装kylin 2018年4月15日 15:06 安装需要的环境 1. hadoop集群环境:由于安装的是CDH5.14.0的版本,所以相关组件都是跟5.14.0相关 2. spark采用 ...

  9. [SHOI2008]cactus仙人掌图

    [题目描述] 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例 ...

  10. NOIP 2009 最优贸易

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...