upload.js 18 KB

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