发布一个图片上传插件,带图片上传后生成预览图片

插件代码:

/*** zx-upload.js v1.0.0* 上传插件* http://www.*.com/** Copyright 2018-2028 zxhj963** Released on: 2018/7/21*/; (function ($, window, document, undefined) {    "use strict";var defaults = {isLayer:true,maxCount: 5,curCount: 0,urls: '',limitWidth: 500,limitHeight: 500,viewWidth: 80,viewHeight: 80,errViewImg:'../images/noimage.gif',savePath: '/upload/upload/upload/',saveServerUrl: "uploadBase64Img.asp"};function Upload($ele, options) {this.$ele = $ele;this.options = $.extend({}, defaults, options);console.log(this.options)this.init();}Upload.prototype = {constructor: Upload,init: function () {this.renderViewBox();this.bindAddEven();this.bindEditEven();this.bindDelEven();},clearViewItem: function () {this.$ele.find('.view-item').remove();  //清除所有的view-item},showUploadBtn: function () {this.$ele.children('.zx-view-box').children('label.button').show(); //显示上传按钮},hideUploadBtn: function () {this.$ele.children('.zx-view-box').children('label.button').hide(); //隐藏上传按钮},resizeImgSize: function (originWidth, originHeight, maxWidth, maxHeight) {var targetWidth = originWidth, targetHeight = originHeight;if (originWidth > maxWidth || originHeight > maxHeight) {if (originWidth / originHeight > maxWidth / maxHeight) {// 更宽,按照宽度限定尺寸targetWidth = maxWidth;targetHeight = Math.round(maxWidth * (originHeight / originWidth));} else {targetHeight = maxHeight;targetWidth = Math.round(maxHeight * (originWidth / originHeight));}}else {targetWidth = originWidth;targetHeight = originHeight;}return {w: targetWidth,h: targetHeight}},getImageSize: function (url,callback) {var img = new Image();img.src = url;// 如果图片被缓存,则直接返回缓存数据if (img.complete) {var ret =  {w: img.width,h: img.height};callback(ret)} else {// 完全加载完毕的事件img.onload = function () {var ret = {w: img.width,h: img.height};callback(ret)}}return ret;},getImgUrlBase64: function (imageObj, targetSize) {var canvas = document.createElement('canvas');//创建预览图片canvas.width = targetSize.w;canvas.height = targetSize.h;var ctx = canvas.getContext("2d");ctx.clearRect(0, 0, canvas.width, canvas.height);         // 清除画布ctx.drawImage(imageObj, 0, 0, canvas.width, canvas.height);var Img64 = canvas.toDataURL();   // 压缩后的base64串return Img64;},getInputUrls: function () {//获取文本框中的链接和链接数量var that = this,urls = that.$ele.children('input.zx-urlInput').val(),urls_arr = urls.split(','),counts = (urls == '') ? 0 : urls_arr.length,maxCount = this.options.maxCount;if (counts >= maxCount) {var temp_arr = [];urls_arr.forEach(function (e, i) {if (i < maxCount) { temp_arr.push(e); }});urls = temp_arr.join(',');counts = maxCount;that.hideUploadBtn();}else {that.showUploadBtn();}that.$ele.children('input.zx-urlInput').val(urls);return {urls: urls,counts: counts};},renderViewBox: function () {var that = this;that.clearViewItem(); var curUrls = that.getInputUrls().urls;var curCount = that.getInputUrls().counts;if (curCount > 0) {var arr_Urls = curUrls.split(',');arr_Urls.forEach(function (e, i) {if (i < that.options.maxCount) {var viewImg64 = that.options.errViewImg;var viewItemHtml = '<div class="view-item"><img src="' + viewImg64 + '" /><div class="admin-box"><a href="javascript:void(0);"  class="edit-btn" data-inputName="pic_1">编辑</a> | <a href= "javascript:void(0);"  class="del-btn" >删除</a></div></div>';that.$ele.children('.zx-view-box').append(viewItemHtml);//e为文本框中的图片链接地址,需转换成viewImg64的预览图片地址that.getImageSize(e, function (ret) {var viewImg64Size = that.resizeImgSize(ret.w, ret.h, that.options.viewWidth, that.options.viewHeight);var imgView = new Image();imgView.src = e;imgView.onload = function () {var viewImg64 = '';if (imgView.fileSize > 0 || (imgView.width > 0 && imgView.height > 0)) {viewImg64 = that.getImgUrlBase64(imgView, viewImg64Size)} else {viewImg64 = that.options.errViewImg;}that.$ele.children('.zx-view-box').find('.view-item').eq(i).children('img').attr('src', viewImg64);}});} else {}});}},bindAddEven: function () {var that = this; var newUrls = '', msg='';that.$ele.children('.zx-view-box').on('change', '.zx-fileInput', function () {var curUrls = that.getInputUrls().urls;var curCount = that.getInputUrls().counts;newUrls = curUrls;if (curCount >= that.options.maxCount) {return false;}else {var file = this.files[0];var rFilter = /^(image\/bmp|image\/gif|image\/jpeg|image\/png|image\/tiff)$/i;if (!rFilter.test(file.type)) {if (that.options.isLayer) {msg = '数据错误,提交的数据不是文件!';if (that.options.isLayer) {layer.alert(msg, { icon: 2 });} else {alert(msg);}} else {msg = '文件格式不正确!';if (that.options.isLayer) {layer.alert(msg, { icon: 2 });} else {alert(msg);}}return false;}else {if (!!file) {//是图片文件,开始上传到服务器var reader = new FileReader();reader.readAsDataURL(file);  // 图片文件转换为base64reader.onload = function () {   // 文件加载完成var def_url = this.result;  //图片原图的base64链接  var image = new Image();image.src = def_url;image.onload = function () {var originWidth = this.width, originHeight = this.height;   // 图片原始尺寸var limitWidth = that.options.limitWidth, limitHeight = that.options.limitHeight;    // 保存图片的最大尺寸限制var targetSize = that.resizeImgSize(originWidth, originHeight, limitWidth, limitHeight);   // 图片尺寸超过限制,调整尺寸var targetImg64 = that.getImgUrlBase64(image, targetSize);var formData = new FormData();formData.append("imgUrl", targetImg64);formData.append("savePath", that.options.savePath);$.ajax({type: "POST",url: that.options.saveServerUrl, data: formData,dataType: "json", //声明成功使用json数据类型回调//如果传递的是FormData数据类型,那么下来的三个参数是必须的,否则会报错cache: false,  //默认是true,但是一般不做缓存processData: false, //用于对data参数进行序列化处理,这里必须false;如果是true,就会将FormData转换为String类型contentType: false,  //一些文件上传http协议的关系,自行百度,如果上传的有文件,那么只能设置为falsesuccess: function (ret) {  //请求成功后的回调函数if (ret.code == 200) {msg = '<span class="icon-check"> 上传成功!</div>';if (that.options.isLayer) {layer.msg(msg, {area:['','46px'], title: false });} else {alert(msg);}var imgUrl = ret.msg;//将上传成功后返回得到的链接添加到当前urls的后面newUrls = (curUrls == "") ? imgUrl : (newUrls + "," + imgUrl);that.$ele.children('input.zx-urlInput').val(newUrls);  //更新文本框的值//生成缩略图var imageView = new Image();imageView.src = imgUrl;imageView.onload = function () {var viewSize = that.resizeImgSize(originWidth, originHeight, that.options.viewWidth, that.options.viewHeight);var viewImg64 = that.getImgUrlBase64(imageView, viewSize);var viewItemHtml = '<div class="view-item"><img src="' + viewImg64 + '" /><div class="admin-box"><a href="javascript:void(0);"  class="edit-btn" data-inputName="pic_1">编辑</a> | <a href= "javascript:void(0);"  class="del-btn" >删除</a></div></div>';that.$ele.children('.zx-view-box').append(viewItemHtml);if (that.getInputUrls().counts >= that.options.maxCount) {that.hideUploadBtn();}else {return false;}};                                                }else {msg = '上传失败!';if (that.options.isLayer) {layer.alert(msg, { icon: 2 });} else {alert(msg);}}}});}}}else {return false;}}}});},bindEditEven: function () {var that = this;that.$ele.children('.zx-view-box').on('click', '.edit-btn', function () {var msg = '编辑功能开发中。。。!';if (that.options.isLayer) {layer.alert(msg, { icon: 2 });} else {alert(msg);}});},bindDelEven: function () {var that = this;var newUrls = '';that.$ele.children('.zx-view-box').on('click', '.del-btn', function () {//删除当前预览项var index = $(this).parents('.view-item').index();  //当前item的序号;用于删除input当中的值var curUrls = that.getInputUrls().urls;var curCount = that.getInputUrls().counts;if (curCount > 0) {var urls_arr = curUrls.split(',');var temp_arr = [];urls_arr.forEach(function (e, i) {if (i != index - 1) { temp_arr.push(e); }else { }});newUrls = temp_arr.join(','); $(this).parents('.view-item').remove();} else {newUrls = '';}that.showUploadBtn();that.$ele.children('input.zx-urlInput').val(newUrls);});}};$.fn.ZX_upload = function (options) {options = $.extend(defaults, options || {});    //合并对象return new Upload($(this), options);}
})(jQuery, window, document);

先贴上代码!
插件使用方法:

本插件需要依赖jquery库,我用的是jquery-1.12.4.js,另外layer插件可以按您的需要引用,也可以不引用,但是如果options的参数中的isLayer如果设置为true时,则必须引入layer库

先引用jquery.js库,我用的是jquery-1.12.4.js,
再引入layer.js库
再引入pintuer UI,不引用则需要按实际需要调整样式;

项目中调用插件方法:

    <script type="text/javascript" src="../js/jquery.zx-upload.js"></script><script type="text/javascript">$(function () {var upload1 = $('.upload-box-1').ZX_upload({maxCount: 1});var upload2 = $('.upload-box-2').ZX_upload({maxCount: 5});});</script>

缺点:图片不能多张图片上传,每次只能上传一张图片。

**特别注意**
1. 上传图片的接口,是以二进制流的格式传递的,所以在获取数据时要注意。(ASP后台建议使用各类无组件文件上传类,如:AnUpLoad上传类等,有需要的可以给我留言)
2. 文件上传接口需要提供的数据格式为json格式,上传成功需要得到{code:200,msg:""},msg中为上传后的图片链接,如果上传失败,则需要将code给成其他值既可以。

Mark: 2018/7/21 18:05 因时间关系 编辑功能 还在开发中。

一个图片上传插件,含图片上传后生成预览图片相关推荐

  1. input文件框选择本地图片后页面预览图片并获取图片长宽以及大小 图片上传前预览

    前面有转过一篇通过HTML5来实现图片上传前预览 ,现在借助FileReader也实现了这个需求.并且同时还可以获得图片的长宽相素以及图片文件的大小.demo如下: <html> < ...

  2. Java图片流导出图片为黑屏,Matisse预览图片黑屏,Glide内存溢出

    项目中要到图片.视频选择的功能,然后google了一下,找到Matisse,知乎的图片选择框架,用的人还挺多的,果断依赖gradle,然后开始我的踩坑之旅. 首先,框架本身的图片框架glide是v3版 ...

  3. win10不能预览图片

    win10在系统清理后不能预览图片了, 有两种方法,我试的第2个方法可以解决: 一:更改全局视觉设置: 1.首先右键 此电脑-属性或者从控制面板-系统和安全打开系统.显示如下图 3.这时进入" ...

  4. elementui 使用el-image 控件 解决 通过点击查看按钮两次才能 实现预览图片

    需求:点击查看按钮,将图片显示出来. 问题:查看按钮必须触发两次才会将图片显示出来 前端效果: 点击查看按钮,弹出来图片 图片展示: 解决方法有两种: 第一种 调用Image 的源码中的image-v ...

  5. Vue vant 使用 ImagePreview 预览图片

    Vue vant 使用 ImagePreview 预览图片 场景1 编列数组生成图片,点击预览图片 <div class="zoom"v-for="(item, i ...

  6. 在BAE搭建的Django中实现图片上传并用jquery预览图片

    在BAE上搭建好了django,如何实现图片上传并预览呢? 想要实现图片上传并不难,但是想看到刚上传的图片,就得在服务器返回上传后图片的url.可是返回数据的话,网页就会重定向.因此想要在上传页面预览 ...

  7. 2016/4/19 ①单个文件上传 ②上传图片后 预览图片

    1,f1.php <!DOCTYPE html> <htmllang="en"> <head><metacharset="UTF ...

  8. [ASP.NET2.0] asp.net在ie7中使用FileUpload上传前预览图片 [ZT]

    asp.net在ie7中使用FileUpload上传前预览图片 因为安全性问题,IE7禁用了image控件引用本地图片,为了这个问题郁闷了好几天,终于找到了解决方案,好东西要与大家分享,代码如下: 此 ...

  9. ajax js图片上传到php,Ajax上传并预览图片(附代码)

    这次给大家带来Ajax上传并预览图片(附代码),Ajax上传并预览图片的注意事项有哪些,下面就是实战案例,一起来看一下. 1. 直接上最简单的 一种 ajax 异步上传图片,并预览 html: 图片上 ...

  10. JQ input 文件上传并预览 选择图片后,在页面上预览图片,页面渲染

    有时候,我们更新界面信息时会遇到,选择图片后,并不能预览图片,必须提交数据库后才能在页面上显示出来,这样我们该怎样办呢? 起始jq为我们提供了两个方法change()和URL.createObject ...

最新文章

  1. 系统科学丨钱学森:我对系统学认识的历程
  2. centos 编译 mysql_Centos Mysql 编译安装调试
  3. centos打显卡驱动命令_ubuntu16.04安装显卡以及驱动经验
  4. 阿里巴巴在应用性能测试场景设计和实现上的实践
  5. 使用Spring Boot和H2可以完全工作的原型
  6. GrapeCity Documents for Excel 与 Apache POI 功能对比
  7. Notepad++相关插件
  8. 「管理数学基础」1.3 矩阵理论:特征值与特征向量
  9. Docker的核心概念镜像Images, 容器Containers, 数据卷Volumes
  10. 【信息融合】基于BP神经网络和DS 证据理论实现不确定性信息融合问题附matlab代码
  11. gif 格式图片详细解析
  12. 程序员面试:未来五年的规划是怎样的?
  13. 医疗废物信息管理系统
  14. 博士生DIY超级显微镜,直接看到原子
  15. Domain=DDXMLErrorDomain Code=1 (null)
  16. 手机网页版微信分享以及微信授权
  17. 二重积分x^2+y^2_求二重积分∫∫|x^2+y^2-2x|dQ,区域D:X^2+Y^2
  18. 5 MATLAB参数估计与假设检验-参数估计
  19. 【FFH】如何在鸿蒙系统上进行抓包测试
  20. informix GBase锁表处理 | ISAM error: key value locked

热门文章

  1. nmap工具进行端口扫描
  2. obs代码总体架构图
  3. 小码哥C++:第一课
  4. [USACO09OCT]谷仓里的回声Barn Echoes(hush、STL)
  5. 无人驾驶学习(二):定位与导航
  6. vue项目出现错误component lists rendered with v-for should have explicit keys
  7. 微信公众号授权前端(uniapp为例)
  8. linux内核源码分析之proc文件系统(二)
  9. 新浪微博首席PHP技术顾问惠新宸:相信PHP可以走的更长远
  10. Learn to say “fuck you” to the world every once in a while