upload.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. var upload_pic = [];
  2. var upload_pic_info = [];
  3. var upload_file = [];
  4. var upload = [];
  5. var showUploadE = false;
  6. var showUploadFilesUploadE = false;
  7. var showUploadFilesSearchE = false;
  8. var showUploadFilesSearchState = 1;
  9. var showUploadFilesSearchAll = false;
  10. var upload_search_default = '';
  11. var showUploadUrl;
  12. var showUploadType = 1;
  13. var showUploadCall = false;
  14. var showUploadThis = false;
  15. var showUploadIndex = false;
  16. var picManageE = false;
  17. var picManageI = false;
  18. var picManageV = false;
  19. var picManageLayer = false;
  20. var showUploadFilesValue = [];
  21. //创建监听函数
  22. var xhrOnProgress=function(fun) {
  23. xhrOnProgress.onprogress = fun; //绑定监听
  24. //使用闭包实现监听绑
  25. return function() {
  26. //通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
  27. var xhr = $.ajaxSettings.xhr();
  28. //判断监听函数是否为函数
  29. if (typeof xhrOnProgress.onprogress !== 'function')
  30. return xhr;
  31. //如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
  32. if (xhrOnProgress.onprogress && xhr.upload) {
  33. xhr.upload.onprogress = xhrOnProgress.onprogress;
  34. }
  35. return xhr;
  36. }
  37. }
  38. function showUpload(i,e,key,url,assets,type)
  39. {
  40. layui.use(['upload','layer','element'], function() {
  41. var html = '';
  42. var layer = layui.layer;
  43. var layerConfig = {
  44. type: 1,
  45. title: e.attr('value'),
  46. shade: 0.1,
  47. shadeClose : true,
  48. content: html,
  49. area: ['800px', '600px']
  50. };
  51. e.unbind('click').bind('click', function()
  52. {
  53. url = url.replace('save', 'view');
  54. showUploadE = e;
  55. if (!type) {
  56. type = 1;
  57. }
  58. showUploadType = type;
  59. showUploadUrl = url;
  60. var cur = $('#' + showUploadE.attr('v')).val();
  61. var value = '';
  62. if (e.attr('data-value')) {
  63. value = e.attr('data-value');
  64. }
  65. var upload_search = '';
  66. if (e.attr('upload_search')) {
  67. upload_search = e.attr('upload_search');
  68. }
  69. $.getJSON(url, {json:1,key:key,cur:cur,value:value,upload_search:upload_search}, function(t)
  70. {
  71. if (showUploadIndex) {
  72. layer.close(showUploadIndex);
  73. }
  74. //layer.closeAll();
  75. layerConfig.content = t.data;
  76. layerConfig.end = function() {
  77. if (showUploadFilesUploadE) {
  78. showUploadFilesUploadE = false;
  79. }
  80. }
  81. showUploadIndex = layer.open(layerConfig);
  82. })
  83. })
  84. });
  85. }
  86. function editorShowUpload(cur, url, title, func, self)
  87. {
  88. showUploadType = 2;
  89. showUploadCall = func;
  90. showUploadThis = self;
  91. layui.use(['upload','layer','element'], function() {
  92. var html = '';
  93. var layer = layui.layer;
  94. var layerConfig = {
  95. type: 1,
  96. title: title,
  97. shade: 0.1,
  98. shadeClose : true,
  99. content: html,
  100. area: '800px'
  101. };
  102. url = url.replace('save', 'view');
  103. showUploadUrl = url;
  104. $.getJSON(url, {json:1,cur:cur}, function(t)
  105. {
  106. layerConfig.content = t.data;
  107. showUploadIndex = layer.open(layerConfig);
  108. })
  109. });
  110. }
  111. //删除
  112. function showUploadFilesSetState(e, url)
  113. {
  114. if (confirm('确定进行此项操作吗?')) {
  115. $.getJSON(url, {json:1}, function(t)
  116. {
  117. if (!showUploadFilesSearchE) {
  118. showUploadFilesSearchE = $('#showUploadFilesSearch');
  119. }
  120. showUploadFilesSearch(showUploadFilesSearchE, showUploadFilesSearchState,showUploadFilesSearchAll);
  121. })
  122. }
  123. }
  124. function showUploadFilesShowValue(e)
  125. {
  126. var html = e.html();
  127. layer.alert(html);
  128. }
  129. function showUploadFilesSetValue(e, url, id, value)
  130. {
  131. if (showUploadFilesValue[id]) {
  132. value = showUploadFilesValue[id];
  133. }
  134. layer.prompt({
  135. formType: 2,
  136. value: value,
  137. title: '请输入附加值,例子:key1=value1&key2=value2',
  138. area: ['300px', '150px'] //自定义文本域宽高
  139. }, function(value, index, elem){
  140. showUploadFilesValue[id] = value;
  141. $.getJSON(url, {value:value}, function(t){});
  142. layer.close(index);
  143. });
  144. }
  145. function showUploadFilesSet(e, name, url, id)
  146. {
  147. $('.layui-anim-yes').addClass('layui-anim-no');
  148. $('.layui-anim-yes').removeClass('layui-anim-yes');
  149. e.parent().removeClass('layui-anim-no');
  150. e.parent().addClass('layui-anim-yes');
  151. $('.file_cur').val(url);
  152. if (showUploadType == 1) {
  153. var value = showUploadE.attr('v');
  154. var key = showUploadE.attr('key');
  155. loadUploadSet(showUploadE, value, {name:name,url:url}, key);
  156. } else if (showUploadType == 2) {
  157. showUploadCall.call(showUploadThis, url, name, id);
  158. } else if (showUploadType == 3) {
  159. var value = showUploadE.attr('editor_id');
  160. var key = showUploadE.attr('key');
  161. //KindEditor.insertHtml('#' + value, '<div class="dever-video"><embed src="'+url+'" type="video/x-ms-asf-plugin" width="450" height="300" autostart="false" loop="true" data-id="'+id+'" data-key="'+key+'"/><div style="width:450px;height:20px;">'+name+':'+id+'(请勿修改)</div></div>');
  162. KindEditor.insertHtml('#' + value, '<img src="'+url+'" style="width:450px;height:300px;" data-id="'+id+'" data-key="'+key+'"/>');
  163. }
  164. if (showUploadIndex) {
  165. layer.close(showUploadIndex);
  166. showUploadIndex = false;
  167. } else {
  168. layer.closeAll();
  169. }
  170. }
  171. function showUploadFilesUpload(e)
  172. {
  173. showUploadFilesUploadE = e;
  174. showUploadE.parent().find('.image_upload').click();
  175. }
  176. function showUploadFilesSearch(e, state, all, pg)
  177. {
  178. showUploadFilesSearchE = e;
  179. showUploadFilesSearchState = state;
  180. var p = e.parent();
  181. if (!pg) {
  182. var pg = p.find('.file_pg').val();
  183. }
  184. var key = p.find('.file_key').val();
  185. var name = p.find('.file_filename').val();
  186. var tag = p.find('.file_tag').val();
  187. var cate = p.find('.file_cate').val();
  188. var cur = p.find('.file_cur').val();
  189. var upload_search = p.find('.upload_search').val();
  190. var state = state;
  191. var url = showUploadUrl;
  192. if (upload_search) {
  193. upload_search_default = upload_search;
  194. }
  195. upload_search = upload_search_default;
  196. if (all) {
  197. upload_search = '';
  198. showUploadFilesSearchAll = true;
  199. } else {
  200. showUploadFilesSearchAll = false;
  201. }
  202. showUploadFiles(url, name, key, cate, tag, cur, pg, upload_search, state);
  203. }
  204. function showUploadFiles(url, name, key, cate, tag, cur, pg, upload_search, state)
  205. {
  206. if (!pg) {
  207. pg = 1;
  208. }
  209. $.getJSON(url, {json:1,key:key, name:name,cate:cate, tag:tag, pg:pg, cur:cur, upload_search:upload_search,state:state}, function(t)
  210. {
  211. var t = '<div>' + t.data + '</div>';
  212. html = $(t).find('#component-anim').html();
  213. $("#component-anim").html(html);
  214. })
  215. }
  216. function loadUploadL(i,e,key,url,assets)
  217. {
  218. var value = e.attr('v');
  219. if (typeof(upload[value]) != "undefined") {
  220. //return;
  221. }
  222. upload[value] = true;
  223. upload_pic[value] = [];
  224. upload_pic_info[value] = [];
  225. upload_file[value] = [];
  226. var id = e.attr('id');
  227. var token = e.attr('token');
  228. var host = e.attr('host');
  229. var domain = e.attr('domain');
  230. var path = e.attr('path');
  231. var cover = e.attr('cover');
  232. var search = '';
  233. if (e.attr('upload_search_value')) {
  234. search = e.attr('upload_search_value');
  235. }
  236. if (!cover) {
  237. cover = 1;
  238. }
  239. var uploadUrl = url;
  240. url = domain;
  241. var layerConfig = {
  242. useCdnDomain: true,
  243. disableStatisticsReport: false,
  244. retryCount: 6
  245. };
  246. var putExtra = {
  247. fname: "",
  248. params: {},
  249. mimeType: null
  250. };
  251. layui.use(['layer','element'], function() {
  252. var layer = layui.layer;
  253. var element = layui.element;
  254. $("#" + id).unbind("change").bind("change",function() {
  255. var file = this.files[0];
  256. // eslint-disable-next-line
  257. var finishedAttr = [];
  258. // eslint-disable-next-line
  259. var compareChunks = [];
  260. var observable;
  261. if (file) {
  262. element.progress(id + '_progress', '0%')
  263. layer.load();
  264. var filename = file.name;
  265. var temp = filename.split('.');
  266. putExtra.params["x:name"] = temp[0];
  267. filename = path + hex_md5(file.name) + '.' + temp[temp.length-1];
  268. //不覆盖
  269. if (cover == 2) {
  270. var timestamp = Date.parse(new Date());
  271. filename = path + hex_md5(file.name + '_' + timestamp) + '.' + temp[temp.length-1];
  272. }
  273. // 设置next,error,complete对应的操作,分别处理相应的进度信息,错误信息,以及完成后的操作
  274. var error = function(err) {
  275. //请求异常回调
  276. layer.alert('文件上传错误1');
  277. element.progress(id + '_progress', '0%')
  278. $('#' + id + '_progress').hide();
  279. layer.closeAll('loading');
  280. };
  281. var complete = function(res) {
  282. //&& res.key.match(/\.(jpg|jpeg|png|gif)$/)
  283. if (res.key) {
  284. element.progress(id + '_progress', '0%')
  285. $('#' + id + '_progress').hide();
  286. layer.closeAll('loading');
  287. var data = {};
  288. if (res.hash) {
  289. if (search.indexOf('#') != -1) {
  290. var temp = search.split('#');
  291. search = temp[0];
  292. if (temp[1]) {
  293. temp[1] = $('#update_'+temp[1]+'_value').val();
  294. if (temp[1] > 0) {
  295. search = search + '_' + temp[1];
  296. }
  297. }
  298. }
  299. $.getJSON(uploadUrl.replace('save.start', 'qiniu.addFile'), {source:file.name,file:res.key, key:key, search:search});
  300. data.status = 1;
  301. data.name = res.key;
  302. data.url = host + res.key;
  303. loadUploadSet(e,value,data,key);
  304. } else {
  305. layer.alert('文件上传错误2');
  306. return false;
  307. }
  308. }
  309. };
  310. var next = function(response) {
  311. var chunks = response.chunks||[];
  312. var total = response.total;
  313. // 这里对每个chunk更新进度,并记录已经更新好的避免重复更新,同时对未开始更新的跳过
  314. for (var i = 0; i < chunks.length; i++) {
  315. if (chunks[i].percent === 0 || finishedAttr[i]){
  316. continue;
  317. }
  318. if (compareChunks[i].percent === chunks[i].percent){
  319. continue;
  320. }
  321. if (chunks[i].percent === 100){
  322. finishedAttr[i] = true;
  323. }
  324. }
  325. $('#' + id + '_progress').show();
  326. element.progress(id + '_progress', parseInt(total.percent)+'%')
  327. compareChunks = chunks;
  328. };
  329. var subObject = {
  330. next: next,
  331. error: error,
  332. complete: complete
  333. };
  334. var subscription;
  335. // 调用sdk上传接口获得相应的observable,控制上传和暂停
  336. observable = qiniu.upload(file, filename, token, putExtra, layerConfig);
  337. subscription = observable.subscribe(subObject);
  338. }
  339. })
  340. });
  341. }
  342. function loadUpload(i,e,key,url,assets)
  343. {
  344. var value = e.attr('v');
  345. if (typeof(upload[value]) != "undefined") {
  346. //return;
  347. }
  348. upload[value] = true;
  349. upload_pic[value] = [];
  350. upload_pic_info[value] = [];
  351. upload_file[value] = [];
  352. var data = {};
  353. data.key = key;
  354. var token = e.attr('token');
  355. var host = e.attr('host');
  356. var domain = e.attr('domain');
  357. var path = e.attr('path');
  358. var cover = e.attr('cover');
  359. data.search = '';
  360. if (e.attr('upload_search_value')) {
  361. data.search = e.attr('upload_search_value');
  362. }
  363. if (!cover) {
  364. cover = 1;
  365. }
  366. if (token) {
  367. data.token = token;
  368. }
  369. var uploadUrl = url;
  370. if (domain) {
  371. url = domain;
  372. delete data.key;
  373. //data.key = 2;
  374. }
  375. var id = e.attr('id');
  376. layui.use(['upload','layer','element'], function() {
  377. var layer = layui.layer;
  378. var layuiUpload = layui.upload;
  379. var element = layui.element;
  380. var uploadInst = layuiUpload.render({
  381. elem: '#' + id
  382. ,data: data
  383. ,field: 'file'
  384. ,url: url
  385. ,multiple: true
  386. ,accept:'file'
  387. //,auto:false
  388. ,xhr:xhrOnProgress
  389. ,progress:function(value){//上传进度回调 value进度值
  390. $('#' + id + '_progress').show();
  391. element.progress(id + '_progress', value+'%')//设置页面进度条
  392. }
  393. ,before: function(obj){
  394. if (this.data.search.indexOf('#') != -1) {
  395. var temp = this.data.search.split('#');
  396. this.data.search = temp[0];
  397. if (temp[1]) {
  398. temp[1] = $('#update_'+temp[1]+'_value').val();
  399. if (temp[1] > 0) {
  400. this.data.search = this.data.search + '_' + temp[1];
  401. }
  402. }
  403. }
  404.             }
  405. ,choose: function(obj, self){
  406. if (domain) {
  407. obj.editFile(path, cover);
  408. }
  409. element.progress(id + '_progress', '0%')
  410. //layer.load();
  411. }
  412. ,done: function(data, file) {
  413. if (data.hash) {
  414. data.status = 1;
  415. data.name = data.key;
  416. data.url = host + data.key;
  417. $.getJSON(uploadUrl.replace('save.start', 'qiniu.addFile'), {source:file.name,file:data.key, key:key});
  418. }
  419. element.progress(id + '_progress', '0%')
  420. $('#' + id + '_progress').hide();
  421. layer.closeAll('loading');
  422. if (data.status == 1) {
  423. loadUploadSet(e,value,data,key);
  424. } else {
  425. element.progress(id + '_progress', '0%')
  426. layer.alert(data.message);
  427. return false;
  428. }
  429. }
  430. ,error: function(){
  431. //请求异常回调
  432. layer.alert('文件上传错误');
  433. element.progress(id + '_progress', '0%')
  434. $('#' + id + '_progress').hide();
  435. layer.closeAll('loading');
  436. }
  437. });
  438. });
  439. }
  440. function loadUploadSet(e,value,data,key)
  441. {
  442. if (showUploadFilesUploadE) {
  443. showUploadFilesSearch(showUploadFilesUploadE, showUploadFilesSearchState, showUploadFilesSearchAll);
  444. return;
  445. }
  446. var mul = e.attr('mul');
  447. var place = e.attr('place');
  448. if (mul == 'yes') {
  449. if (e.attr('t') == 'file') {
  450. if (upload_file[value].length <= 0 && $("#" + value).val()) {
  451. upload_file[value] = $("#" + value).val().split(',');
  452. }
  453. var m = $('.' +value+'_mul');
  454. var i = m.find('li').eq(upload_file[value].length);
  455. if (i.length) {
  456. i.find('a').eq(0).html(data.name);
  457. } else {
  458. m.append('<li><a href="'+data.url+'" target="_blank" title="点此下载" >'+data.name+'</a>&nbsp;&nbsp;<a href="javascript:;" title="点此删除" style="color:red;" onclick="fileDel($(this), \''+value+'\')">[删除]</a></li>');
  459. }
  460. upload_file[value].push(data.url);
  461. $("#" + value).val(upload_file.join(','));
  462. } else {
  463. var i = e.attr('i');
  464. var info = '';
  465. if (data.width) {
  466. info = data.width + '_' + data.height + '_' +data.size + '_' + data.fid;
  467. }
  468. if (upload_pic[value].length <= 0 && $("#" + value).val()) {
  469. upload_pic[value] = $("#" + value).val().split(',');
  470. }
  471. if ($('#'+i).length) {
  472. upload_pic_info[value] = $("#" + i).val().split(',');
  473. }
  474. var m = $('.' +value+'_mul');
  475. var index = m.find('img').eq(upload_pic[value].length);
  476. var set = index.length;
  477. var place = m.find('.place');
  478. if (place.length) {
  479. set = false;
  480. }
  481. if (set) {
  482. index.attr('src', data.url);
  483. index.attr('data-src', data.url);
  484. index.attr('info', info);
  485. } else {
  486. m.append('<a href="javascript:;" title="打开图片管理工具" onclick="picManage($(this), \''+value+'\', \''+key+'\', 2, \''+i+'\', \''+place+'\')"><img src="'+data.url+'" data-src="'+data.url+'" info="'+info+'" width="150" class="cropper_img" style="margin-left:5px;" alt="打开图片管理工具"/></a>');
  487. }
  488. upload_pic[value].push(data.url);
  489. $("#" + value).val(upload_pic[value].join(','));
  490. if ($('#'+i).length && info) {
  491. upload_pic_info[value].push(info);
  492. $('#'+i).val(upload_pic_info[value].join(','));
  493. }
  494. }
  495. } else {
  496. if (e.attr('t') == 'file') {
  497. } else {
  498. var i = e.attr('i');
  499. if ($('#show_'+value).length) {
  500. $('#show_'+value).parent().show();
  501. $('#show_'+value).attr('src',data.url).show();
  502. $('#show_'+value).attr('data-src',data.url);
  503. if (!checkClick($('#show_'+value))) {
  504. $('#show_'+value).unbind('click').bind('click', function()
  505. {
  506. picManage($(this), value, key, 1, i, place);
  507. })
  508. }
  509. }
  510. }
  511. $('#'+value).val(data.url);
  512. if ($('#'+i).length && data.width) {
  513. var info = data.width + '_' + data.height + '_' +data.size + '_' + data.fid;
  514. $('#'+i).val(info);
  515. }
  516. }
  517. }
  518. function picSet(pic, s, info)
  519. {
  520. if (picManageE) {
  521. //$('#'+value).val(data.url);
  522. var img = picManageE.find('img');
  523. var old = img.attr('src');
  524. img.attr('src', pic);
  525. var value = $("#" + picManageV);
  526. value.val(value.val().replace(old, pic));
  527. if (s != 1) {
  528. upload_pic[picManageV].replaceOne(old,pic);
  529. }
  530. var i = picManageI;
  531. if ($('#'+i).length) {
  532. if (s == 1) {
  533. $('#'+i).val(info);
  534. } else {
  535. var old = img.attr('info');
  536. if (old) {
  537. upload_pic_info[picManageV].replaceOne(old,info);
  538. $("#" + i).val(upload_pic_info[picManageV].join(','));
  539. }
  540. }
  541. }
  542. }
  543. layer.close(picManageLayer);
  544. }
  545. function picDel(s)
  546. {
  547. if (!picManageE) {
  548. return;
  549. }
  550. if (confirm('确定要删除图片吗?')) {
  551. var v = picManageV;
  552. var e = picManageE;
  553. var i = picManageI;
  554. if (s == 1) {
  555. e.hide();
  556. $("#" + v).val('');
  557. if ($('#'+i).length) {
  558. $('#'+i).val('');
  559. }
  560. } else {
  561. if (upload_pic[v].length <= 0 && $("#" + v).val()) {
  562. upload_pic[v] = $("#" + v).val().split(',');
  563. }
  564. if (upload_pic_info[v].length <= 0 && $('#'+i).length && $("#" + i).val()) {
  565. upload_pic_info[v] = $("#" + i).val().split(',');
  566. }
  567. var p = e.find('img').attr('src');
  568. e.remove();
  569. upload_pic[v].remove(p);
  570. $("#" + v).val(upload_pic[v].join(','));
  571. if ($('#'+i).length) {
  572. var info = e.find('img').attr('info');
  573. upload_pic_info[v].remove(info);
  574. $("#" + i).val(upload_pic_info[v].join(','));
  575. }
  576. }
  577. }
  578. layer.close(picManageLayer);
  579. }
  580. function picManage(e,v,k,s,i,wh)
  581. {
  582. if (!s) {
  583. s = 2;
  584. }
  585. if (!wh) {
  586. wh = '160*90';
  587. }
  588. picManageE = e;
  589. picManageV = v;
  590. picManageI = i;
  591. var param = '';
  592. var img = e.find('img');
  593. if (img.attr('data-src')) {
  594. var pic = img.attr('data-src');
  595. param = img.attr('src');
  596. } else {
  597. var pic = img.attr('src');
  598. img.attr('data-src', pic);
  599. }
  600. if (pic.indexOf('temp.im') != -1) {
  601. return;
  602. }
  603. var url = config.upload.replace('save', 'view') + '.manage&state='+s+'&key='+k+'&pic=' + pic + '&param=' + param+'&wh='+wh;
  604. var layerConfig = {
  605. type: 2,
  606. title: '图片裁剪工具',
  607. content : [url, 'no'],
  608. shade: 0.1,
  609. shadeClose : true,
  610. area: ['1000px','550px']
  611. };
  612. picManageLayer = layer.open(layerConfig);
  613. }
  614. function fileDel(e,v)
  615. {
  616. if(confirm('确定要删除文件吗?'))
  617. {
  618. if(upload_file[v].length <= 0 && $("#" + v).val())
  619. {
  620. upload_file[v] = $("#" + v).val().split(',');
  621. }
  622. var parent = e.parent();
  623. var p = parent.find('a').eq(0).attr('href');
  624. parent.remove();
  625. upload_file[v].remove(p);
  626. //console.info(pic);
  627. $("#" + v).val(upload_file[v].join(','));
  628. }
  629. }