uploader.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. /*
  2. * @tanqilin 2016 07 05
  3. * 百度上传插件
  4. *
  5. * UploaderPick:"#", //绑定按钮id
  6. * UploaderUrl:"", //百度插件地址
  7. * UploaderServer:"", //上传api
  8. * UploaderMax:5 //现在最大上传个数
  9. * UploadHiddenField:"" //隐藏域name
  10. */
  11. var uploadlist = "";
  12. var uploadObj = [];
  13. function upload(obj){
  14. this.upobj = {
  15. UploaderUrl : obj.UploaderUrl ? obj.UploaderUrl : "/addons/online_album/public/base/js/plugins/webuploader/webuploader.min.js",
  16. //UploaderUrl : obj.UploaderUrl ? obj.UploaderUrl : "/base/js/plugins/webuploader/webuploader.min.js",
  17. //UploaderServer : obj.UploaderServer ? obj.UploaderServer :"/api/attachment/webupload?elementid=&watermark=" + obj.UploadWatermark + "&_time=" + Math.random() ,
  18. UploaderServer : obj.UploaderServer ? obj.UploaderServer :"/addons/online_album/public/?route=api/attachment/webupload?elementid=&watermark=" + obj.UploadWatermark + "&_time=" + Math.random() ,
  19. UploaderPick : obj.UploaderPick ? obj.UploaderPick : "#upload01" ,
  20. UploaderMax : obj.UploaderMax ? obj.UploaderMax : 100,
  21. UploaderSingle : obj.UploaderSingle ? obj.UploaderSingle : false,
  22. UploadHiddenField : obj.UploadHiddenField ? obj.UploadHiddenField : "field[]",
  23. UploadWatermark : obj.UploadWatermark ? obj.UploadWatermark : ""
  24. },
  25. this.loadJS = function(url, callback){
  26. var head = document.getElementsByTagName("head")[0];
  27. var script = document.createElement("script");
  28. script.src = url;
  29. var done = false;
  30. script.onload = script.onreadystatechange = function() {
  31. if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) {
  32. done = true;
  33. callback();
  34. script.onload = script.onreadystatechange = null;
  35. head.removeChild(script);
  36. }
  37. };
  38. head.appendChild(script);
  39. }
  40. var _this=this;
  41. this.attachEventload(function(){
  42. _this.loadCom();
  43. });
  44. }
  45. upload.prototype.attachEventload = function(argument){
  46. // 判断页面是否加载完毕
  47. if (window.attachEvent) {
  48. window.attachEvent("onload",argument);
  49. } else if (window.addEventListener) {
  50. window.addEventListener("load",argument, false);
  51. }
  52. };
  53. upload.prototype.loadCom = function() {
  54. var _this=this;
  55. $("body").append("<style type='text/css'>\
  56. div.layout_upload ul,div.layout_upload li{ padding: 0px; margin: 0px;list-style-type:none;word-wrap:break-word; white-space:normal; word-break:break-all;}\
  57. div.layout_upload ul.ullit li{float:left;width:150px;height:150px;position:relative;z-index:5;zoom:1;margin:0 10px 10px 0}\
  58. div.layout_upload ul.ullit li em{font-weight: 100;opacity: 1;box-shadow: none;font-size: 12px;width:15px;height:15px;cursor:pointer;font-style:normal;line-height:15px;border-radius:15px;-moz-border-radius:15px;-webkit-border-radius:15px;-o-border-radius:15px;-ms-border-radius:15px;background:#999;color:#fff;text-align:center;position:absolute;z-index:30;zoom:1;right:-7px;top:-7px}\
  59. div.layout_upload ul.ullit li img{width:100%;height:auto;display:block}\
  60. div.layout_upload ul.ullit li .layout_upload_but{width:150px;height:150px;border: 5px #eee solid;display:block;line-height:60px;text-align:center;background:url(/addons/online_album/public/base/plugins/imguploader/img/uploadCamera.png) no-repeat center center #fefefe}\
  61. div.layout_upload ul.ullit li .layout_upload_but .webuploader-pick{height:150px; background:none;}\
  62. div.layout_upload ul.ullit li .rate{width:100%;height:4px;background:#9e9e9e;overflow:hidden;position:absolute;z-index:800;zoom:1;left:0;bottom:-8px;display:none}\
  63. div.layout_upload ul.ullit li .rate span{overflow:hidden;width:0;height:4px;background:#36c3be;display:block;transition:all 400ms ease-out 0s;-o-transition:all 400ms ease-out 0s;-moz-transition:all 400ms ease-out 0s;-webkit-transition:all 400ms ease-out 0s;transform-origin:center}\
  64. div.layout_upload ul.ullit li .yes,div.layout_upload ul.ullit li .no{display:none;color:#fff;font-size:12px;text-align:center;position:absolute;z-index:10;zoom:1;bottom:0;left:0;width:100%;height:100%;line-height:60px; margin: 0;}\
  65. div.layout_upload ul.ullit li .yes{height:20px;line-height:20px}.layout_love h3{height:65px;line-height:65px;position:relative;z-index:5;zoom:1;text-align:center}\
  66. .layout_love h3 span{background:#fff;position:relative;z-index:10;zoom:1;font-size:18px;font-weight:100;display:inline-block;padding:0 10px}\
  67. div.layout_upload ul.ullit li .file{ margin:0px; }\
  68. div.layout_upload ul.ullit li small.text-danger{ color:#ed5565; }\
  69. div.layout_upload ul.ullit li .file-name{ height:48px; padding:5px;}\
  70. div.layout_upload ul.ullit li .file-name p{ height:20px; margin:0; overflow: hidden;}\
  71. div.layout_upload ul.ullit li .webuploader-element-invisible { position: absolute; clip: rect(1px 1px 1px 1px);}\
  72. </style>")
  73. if(typeof WebUploader != 'undefined'){
  74. _this.upLoader();
  75. }else{
  76. this.loadJS(this.upobj.UploaderUrl + "?t=" + Math.random() ,function(){
  77. _this.upLoader();
  78. });
  79. }
  80. };
  81. upload.prototype.upLoader=function(){
  82. var _this = this;
  83. var imgLinst = 0;
  84. var imgbuthtml = "";
  85. // 百度上传插件初始化
  86. var uploader = WebUploader.create({
  87. // swf文件路径
  88. swf:'/addons/online_album/public/base/plugins/imguploader/uploader.swf',
  89. // swf:'/base/plugins/imguploader/uploader.swf',
  90. // 文件接收服务端。
  91. server: this.upobj.UploaderServer,
  92. // 选择文件的按钮。可选。
  93. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
  94. pick: this.upobj.UploaderPick,
  95. //现在最大上传数
  96. fileNumLimit: _this.upobj.UploaderMax,
  97. //fileSizeLimit: 500 * 1024 * 1024,
  98. //fileSingleSizeLimit: 10 * 1024 * 1024,
  99. extensions:'jpg|jpeg|gif|png|bmp',
  100. // 是否选择就上传
  101. auto: true,
  102. accept: {
  103. title: 'Images',
  104. extensions: 'gif,jpg,jpeg,bmp,png',
  105. mimeTypes: 'image/*'
  106. }
  107. // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  108. //resize: false
  109. });
  110. // 传递参数
  111. /* uploader.option("formData", {
  112. // _token : "$token",
  113. elementid: "",
  114. watermark: this.upobj.UploadWatermark,
  115. _time: Math.random()
  116. });*/
  117. // 判断格式
  118. uploader.on("error",function(type){
  119. //仅支持JPG、GIF、PNG、JPEG、BMP格式,
  120. if(type=='F_EXCEED_SIZE'||type=='Q_EXCEED_SIZE_LIMIT'){
  121. layer.msg("上传的图片太大", {icon: 2});
  122. return false;
  123. }else if(type=="Q_TYPE_DENIED"){
  124. layer.msg("请上传JPG、GIF、PNG、JPEG、BMP格式", {icon: 2});
  125. return false;
  126. }else if(type=="Q_EXCEED_NUM_LIMIT"){
  127. layer.msg("超过图片最大上传数量", {icon: 2});
  128. return false;
  129. }else {
  130. layer.msg("服务器繁忙请稍候再试", {icon: 2});
  131. return false;
  132. }
  133. });
  134. // 上传进度
  135. uploader.on("uploadProgress",function(file,percentage){
  136. var $li=$("#rt_"+file.source.ruid).parent().parent().parent().find("li[data-uploaderId='"+file.id+"']");
  137. $li.find("small").show().html("正在上传文件");
  138. $li.find(".rate").show().find("span").css({"width":percentage*100+"%"});
  139. if(percentage==1){
  140. $li.find(".rate").hide();
  141. $li.find("small").show().html("正在保存数据");
  142. }
  143. });
  144. // 生成预览图
  145. uploader.on("fileQueued",function(file,percentage){
  146. var butThis = _this.upobj,
  147. file = file;
  148. imgLinst ++;
  149. var but =$("#rt_"+file.source.ruid).parents('form').find("input[type='submit']");
  150. var upload_num = 0;
  151. if(but.attr('data-upload_num')){
  152. upload_num = parseInt(but.attr('data-upload_num'));
  153. }
  154. but.attr('data-upload_num',upload_num+1);
  155. if(but.val() != "正在上传文件..." || but.val() == ""){
  156. uploadlist = but.val() == "" ? "提交" : but.val();
  157. }
  158. but.val("正在上传文件...");
  159. but.attr("disabled","true");
  160. uploader.makeThumb( file, function( error, src ) {
  161. if ( error ) {
  162. layer.msg("图片不能预览", {icon: 2});
  163. return;
  164. }
  165. var $li2 = '<li data-uploaderId="'+file.id+'">\
  166. <em class="close">×</em>\
  167. <img src="'+src+'" alt="" />\
  168. <p class="rate"><span></span></p>\
  169. <p class="yes">等待上传文件</p>\
  170. <p class="no">上传失败</p>\
  171. </li>';
  172. var $li = '<li data-uploaderId="'+file.id+'">\
  173. <div class="file">\
  174. <span class="corner"></span>\
  175. <div class="image">\
  176. <img src="'+src+'" alt="" />\
  177. </div>\
  178. <div class="file-name">\
  179. <p>'+file.name+'</p>\
  180. <small>等待上传文件</small>\
  181. </div>\
  182. </div>\
  183. <em class="close">×</em>\
  184. <p class="rate"><span></span></p>\
  185. <p class="yes">等待上传文件</p>\
  186. <p class="no">上传失败</p>\
  187. </li>';
  188. if(_this.upobj.UploaderSingle) {
  189. if($("#rt_"+file.source.ruid).parent().parent().parent().children("li").eq(0).find("img").attr('src')){
  190. $("#rt_"+file.source.ruid).parent().parent().parent().children("li").eq(0).find("img").attr('src',src);
  191. $("#rt_"+file.source.ruid).parent().parent().parent().children("li").eq(0).attr('data-uploaderId',file.id);
  192. }else{
  193. $("#rt_"+file.source.ruid).parent().parent().before($li);
  194. }
  195. }else{
  196. $("#rt_"+file.source.ruid).parent().parent().before($li);
  197. }
  198. $("#rt_"+file.source.ruid).parent().parent().parent().find(".close").unbind('click').click(function(){
  199. var but = $("#rt_"+file.source.ruid).parents('form').find("input[type='submit']");
  200. uploader.removeFile($(this).parent().attr("data-uploaderId"));
  201. var upload_num = 0;
  202. if(but.attr('data-upload_num')){
  203. upload_num = parseInt(but.attr('data-upload_num'));
  204. }
  205. if($(this).parents('li').find("small").html() == "等待上传文件"){ but.attr('data-upload_num',upload_num-1); }
  206. if($(this).parents('li').find("small").html() == "正在保存数据" || $(this).parents('li').find("small").html()=="正在上传文件" ||$(this).parents('li').find("small").html() == "等待上传文件"){
  207. uploadObj.push(file.source.ruid);
  208. }
  209. if($(this).parents('li').find("small").html()!="上传成功" && $(this).parents('li').find("small").html()!="保存失败" && $(this).parents('li').find("small").html()!="等待上传文件" ){
  210. //uploadObj.push(file.source.ruid);
  211. upload_num = upload_num-1 <= 0 ? 1 : upload_num;
  212. but.attr('data-upload_num',upload_num-1);
  213. if(upload_num-1 <=0 ) {
  214. $("#rt_"+file.source.ruid).parents('form').find("input[type='submit']").removeAttr("disabled").val(uploadlist);
  215. }
  216. }
  217. $(this).parent().fadeOut("slow",function(){$(this).remove();});
  218. });
  219. },150,150);
  220. });
  221. // 服务器回调
  222. uploader.on('uploadSuccess', function( file, response ) {
  223. var but =$("#rt_"+file.source.ruid).parents('form').find("input[type='submit']");
  224. imgLinst --;
  225. var isuplist = true;
  226. $.each(uploadObj, function(i,v) {
  227. if(file.source.ruid == v){
  228. removeByValue(uploadObj, v);
  229. isuplist = false;
  230. }
  231. });
  232. if(isuplist){
  233. var upload_num = 0;
  234. if(but.attr('data-upload_num')){
  235. upload_num = parseInt(but.attr('data-upload_num'));
  236. }
  237. //upload_num = upload_num-1 < 0 ? 2 : upload_num;
  238. but.attr('data-upload_num',upload_num-1);
  239. if(upload_num-1 <=0 ) {
  240. $("#rt_"+file.source.ruid).parents('form').find("input[type='submit']").removeAttr("disabled").val(uploadlist);
  241. }
  242. }
  243. if(imgLinst <= 0 ){ imgLinst == 0;
  244. // if(isuplist){$("#rt_"+file.source.ruid).parents('form').find("input[type='submit']").removeAttr("disabled").val(uploadlist); isuplist = true;}
  245. }
  246. var ruid=$("#rt_"+file.source.ruid).parent().parent().parent();
  247. if(response.code==200){
  248. ruid.find("li[data-uploaderId='"+file.id+"'] small").html("上传成功").show();
  249. if(_this.upobj.UploaderSingle) {
  250. ruid.find("li[data-uploaderId='"+file.id+"']").append('<input type="hidden" name="'+_this.upobj.UploadHiddenField+'" value="'+response.fileurl+'" >');
  251. }else{
  252. ruid.find("li[data-uploaderId='"+file.id+"']").append('<input type="hidden" name="'+_this.upobj.UploadHiddenField+'[url][]" value="'+response.fileurl+'" >');
  253. ruid.find("li[data-uploaderId='"+file.id+"']").append('<input type="hidden" name="'+_this.upobj.UploadHiddenField+'[alt][]" value="'+response.filename+'" >');
  254. }
  255. }else{
  256. //ruid.find("li[data-uploaderId='"+file.id+"'] small").hide();
  257. ruid.find("li[data-uploaderId='"+file.id+"'] small").html(response.message);
  258. }
  259. });
  260. // setInterval(function(){
  261. // if(imgLinst <= 0){
  262. // imgLinst == 0; $(_this.upobj.UploaderPick).parents('form').find("input[type='submit']").removeAttr("disabled").val(uploadlist);
  263. // }else{
  264. // $(_this.upobj.UploaderPick).parents('form').find("input[type='submit']").val("正在上传文件...").attr("disabled","true");
  265. // }
  266. // },600);
  267. //所有文件上传后触发
  268. uploader.on('uploadComplete', function(file) {
  269. });3
  270. function removeByValue(arr, val) {
  271. for(var i=0; i<arr.length; i++) {
  272. if(arr[i] == val) {
  273. arr.splice(i, 1);
  274. break;
  275. }
  276. }
  277. }
  278. }
  279. var uploadUp = true;
  280. var uploadSet=setInterval(function () {
  281. var eq = 0;
  282. var eq2 = 0;
  283. if($("*[data-uploaderid]").length > 0 ){
  284. eq++;
  285. $.each($("*[data-uploaderid]"), function(index, val) {
  286. if($(this).find("small").html()!="上传成功"&&$(this).find("small").html()!="保存失败"){
  287. uploadUp = false;
  288. }else{
  289. eq2++;
  290. }
  291. });
  292. if(uploadUp || eq == eq2 ){
  293. $("*[data-uploaderid]").parents('form').find("input[type='submit']").removeAttr("disabled").removeAttr("data-upload_num").val(uploadlist);
  294. uploadUp = true;
  295. }
  296. }
  297. },500);