plupload_custom.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. /**
  2. * Plupload上传自定义函数库.
  3. * @auhor nj
  4. * @date 2021-10.29
  5. */
  6. /**
  7. * 上传前本地图预览.
  8. * @param {*} file
  9. * @param {*} callback
  10. * @returns
  11. */
  12. function pluploadPreviewImage(file, callback) {
  13. //file为plupload事件监听函数参数中的file对象,callback为预览图片准备完成的回调函数
  14. if (!file || !/image\//.test(file.type)) {
  15. return; //确保文件是图片
  16. }
  17. let preloader = new window.FileReader();
  18. preloader.readAsDataURL(file.getNative());
  19. preloader.onload = function () {
  20. base64data = preloader.result;
  21. base64data = base64data.substring(base64data.indexOf(",") + 1);
  22. let b64url = "data:" + file.type + ";base64," + base64data;
  23. callback(b64url);
  24. preloader = null;
  25. }
  26. }
  27. /**
  28. * 上传可选择文件类型mime
  29. * @param {*} type
  30. * @returns
  31. */
  32. function pluploadSelectMime(type)
  33. {
  34. let arrTypes = {
  35. image: {title: '图像文件', extensions : 'jpg,jpeg,png,gif,webp'},
  36. zip: {title: '压缩文件', extensions : 'zip,7z,rar,tar,bz,bz2,gz'},
  37. android: {title: 'Apk文件', extensions : 'apk'},
  38. ios: {title: 'Apk文件', extensions : 'ipa'},
  39. mp4: {title: 'mp4文件', extensions : 'mp4'},
  40. media: {title: '视频文件', extensions : 'flv,swf,mkv,rm,rmvb,avi,av,dv,mpeg,mpg,ogg,ogv,mov,wmv,mp4,webm,mp3,wav,mid'},
  41. document: {title: '文档文件', extensions : 'doc,docx,xls,xlsx,ppt,pptx,pdf,wps,txt,xml,kml,md,txt,cnf,conf,ini,yaml,xml'},
  42. config: {title: '配置文件', extensions : 'mobileconfig,plist,xml,cnf,conf,ini,yaml'}
  43. };
  44. let mimeTypes = [];
  45. if (type == 'image') {
  46. mimeTypes.push(arrTypes.image);
  47. } else if (type == 'zip') {
  48. mimeTypes.push(arrTypes.zip);
  49. } else if (type == 'android') {
  50. mimeTypes.push(arrTypes.android);
  51. } else if (type == 'ios') {
  52. mimeTypes.push(arrTypes.ios);
  53. } else if (type == 'mp4') {
  54. mimeTypes.push(arrTypes.mp4);
  55. } else if (type == 'media') {
  56. mimeTypes.push(arrTypes.media);
  57. } else if (type == 'document') {
  58. mimeTypes.push(arrTypes.document);
  59. } else if (type == 'mobile') {
  60. mimeTypes.push(arrTypes.android);
  61. mimeTypes.push(arrTypes.ios);
  62. } else if (type == 'image|document') {
  63. mimeTypes.push(arrTypes.image);
  64. mimeTypes.push(arrTypes.document);
  65. } else if (type == 'all') {
  66. for (const key in arrTypes) {
  67. mimeTypes.push(arrTypes[key]);
  68. }
  69. } else {
  70. // 空字符串默认 图片类.
  71. mimeTypes.push(arrTypes.image);
  72. }
  73. return mimeTypes;
  74. }
  75. /**
  76. * 为demo准备的参数.
  77. * @returns
  78. */
  79. function pluploadMultipartParamsForDemo() {
  80. var param = {
  81. 'receive_type' : 'plupload', // 必写. 接收响应格式.
  82. 'ext_type' : 'image', // 必写. 后端允许的文件格式类型组,多个半角逗号分隔开.
  83. 'module_id' : "demo_module",
  84. 'related_id' : "112233",
  85. 'max_width' : "1024",
  86. 'max_height' : "2000",
  87. 'session_id': "sess__11__22"
  88. };
  89. return param;
  90. }
  91. /**
  92. * 基础上传函数
  93. * @param string idName 标识
  94. * @param array isMultiSelection 是否允许多选.
  95. * @param array mimeTypes 允许UI可选择的扩展名文件
  96. * @param Object multipartParams 上传组件依赖的入参.
  97. * @param integer chunkMaxSizeKb 分块上传的单个最大尺寸, 单位kb.
  98. * @param integer uploadMaxSizeKb 单个最大上传kb.
  99. * @param bool isMultiPart 是否分块上传.
  100. * @param Object cbFuncObjs 回掉函数对象.
  101. * @returns
  102. */
  103. function pluploadBase(idName, isMultiSelection, mimeTypes, multipartParams, chunkMaxSizeKb, uploadMaxSizeKb, isMultiPart, cbFuncObjs)
  104. {
  105. var param = pluploadParseUploadParam(idName, isMultiSelection, mimeTypes, multipartParams, chunkMaxSizeKb, uploadMaxSizeKb, isMultiPart);
  106. param.init = {
  107. //文件添加
  108. 'FilesAdded' : function(up, files) {
  109. cbFuncObjs.FilesAdded(idName, up, files);
  110. // 文件选择后即刻上传.
  111. this.start();
  112. },
  113. //单个文件上传过程中
  114. 'UploadProgress' : function(up, file) {
  115. cbFuncObjs.UploadProgress(idName, up, file);
  116. },
  117. //单个文件成功上传后
  118. 'FileUploaded' : function(up, file, info) {
  119. cbFuncObjs.FileUploaded(idName, up, file, info);
  120. },
  121. //一个队列文件上传完毕后
  122. 'UploadComplete' : function(up, files) {
  123. cbFuncObjs.UploadComplete(idName, up, files);
  124. },
  125. //错误信息反馈
  126. 'Error' : function(up, err) {
  127. cbFuncObjs.Error(idName, up, err);
  128. }
  129. };
  130. var uploader = new plupload.Uploader(param);
  131. return uploader;
  132. }
  133. /**
  134. * 解析上传组件参数.
  135. * @param string idName 前置标识
  136. * @param string isMultiSelection 是否允许多选.
  137. * @param array mimeTypes 允许UI可选择的扩展名文件
  138. * @param Object multipartParams 上传组件依赖的入参.
  139. * @param integer chunkMaxSizeKb 分块上传的单个最大尺寸, 单位kb.
  140. * @param integer uploadMaxSizeKb 单个最大上传kb.
  141. * @param bool isMultiPart 是否分片上传.
  142. */
  143. function pluploadParseUploadParam(idName, isMultiSelection, mimeTypes, multipartParams, chunkMaxSizeKb, uploadMaxSizeKb, isMultiPart) {
  144. if (typeof(mimeTypes) == 'undefined') {
  145. mimeTypes = [
  146. {title : "图像文件", extensions : "jpg,png,gif,webp"}
  147. ];
  148. }
  149. if (typeof(isMultiSelection) == 'undefined') {
  150. isMultiSelection = true;
  151. }
  152. if (typeof(isMultiPart) == 'undefined') {
  153. isMultiPart = true;
  154. }
  155. if (typeof(chunkMaxSizeKb) == 'undefined') {
  156. chunkMaxSizeKb = 0;
  157. }
  158. if (typeof(uploadMaxSizeKb) == 'undefined') {
  159. uploadMaxSizeKb = 0;
  160. }
  161. if (typeof(window._PLUP_FILE_FIELD_NAME_) == 'undefined') {
  162. window._PLUP_FILE_FIELD_NAME_ = 'upload_files';
  163. }
  164. idName = idName.toString();
  165. var param = {
  166. //'container': null, // ... or DOM Element itself
  167. 'browse_button' : 'pl_btn_select_' + idName, //选择文件按钮ID
  168. 'url' : window._PLUP_SERVER_URI_, //请求服务端的URL
  169. //过滤器
  170. 'filters' : {
  171. //扩展名
  172. 'mime_types' : mimeTypes,
  173. //最大单个文件大小
  174. 'max_file_size' : parseInt(uploadMaxSizeKb) * 1024,
  175. //防止文件重复,根据文件名和文件大小判断的
  176. 'prevent_duplicates' : false
  177. },
  178. //是否启用数据流传输结构,true=使用multipart格式并支持chunk大文件分片段上传
  179. 'multipart' : isMultiPart,
  180. 'multi_selection' : isMultiSelection, // true = 支持多个文件选择; false=仅单个文件
  181. //分块附带参数
  182. 'multipart_params' : multipartParams,
  183. //最大重试次数
  184. 'max_retries' : 0,
  185. //大文件分块单元块大小,如果大于0,则表示启用分块传输
  186. //分块上传将不支持图片尺寸调整、图片水印
  187. 'chunk_size' : parseInt(chunkMaxSizeKb) * 1024,
  188. //'drop_element' : null,
  189. 'unique_names' : false, //文件名前端确保唯一性
  190. 'runtimes' : 'html5,flash,silverlight,html4',
  191. 'file_data_name' : window._PLUP_FILE_FIELD_NAME_,
  192. //'container' : '',
  193. 'flash_swf_url' : window._PLUP_PATH_ + 'js/Moxie.swf',
  194. 'silverlight_xap_url' : window._PLUP_PATH_ + 'js/Moxie.xap'
  195. };
  196. return param;
  197. }
  198. /**
  199. * 上传中的话柄
  200. * @param {*} idName
  201. * @param {*} up
  202. * @param {*} file
  203. */
  204. function pluploadFuncUploadProgress(idName, up, file)
  205. {
  206. layui.use(['jquery', 'element', 'layer'], function () {
  207. let $ = layui.jquery;
  208. // 隐藏按钮
  209. var id = 'pl_btn_select_' + idName;
  210. $('#' + id).hide();
  211. var hcode = '<span class="u-uploader-progress">文件[' + file.name +']正在上传,进度'+ file.percent + '%</span>';
  212. $('#pl_progress_'+ idName).html(hcode);
  213. });
  214. }
  215. /**
  216. * 单个上传完毕的话柄.
  217. * @param {*} idName
  218. * @param {*} up
  219. * @param {*} file
  220. * @param {*} info
  221. */
  222. function pluploadFuncFileUploaded(idName, up, file, info)
  223. {
  224. layui.use(['jquery', 'element', 'layer'], function () {
  225. let $ = layui.jquery;
  226. var id = 'pl_result_' + idName;
  227. var obj = $.parseJSON(info.response);
  228. if (obj.hasOwnProperty('result')) {
  229. var result = obj.result;
  230. var hcode = '<li><p>文件链接:' + result.link_url + '</p><img src="" class="result_items" data-ceb-url="'+ result.link_url +'"></li>';
  231. $('#' + id).append(hcode);
  232. $('#' + id).children('li').each(function(index, ele) {
  233. if ($(this).children('img').length > 0) {
  234. var imgSrc = $(this).children('img').attr('src');
  235. if (!imgSrc) {
  236. // 优化,仅无src数据才渲染.
  237. onceRender($(this).children('img'));
  238. }
  239. }
  240. });
  241. } else {
  242. if (obj.hasOwnProperty('error')) {
  243. var errorInfo = obj.error;
  244. var hcode = '<li>['+ errorInfo.code +'错误信息]【'+ file.name +'】'+ errorInfo.message +'</li>';
  245. $('#' + id).append(hcode);
  246. }
  247. }
  248. });
  249. }
  250. /**
  251. * 所有选中文件上传完毕后的话柄.
  252. * @param {*} idName
  253. * @param {*} up
  254. * @param {*} files
  255. */
  256. function pluploadFuncUploadComplete(idName, up, files)
  257. {
  258. layui.use(['jquery'], function () {
  259. let $ = layui.jquery;
  260. $('#pl_status_'+ idName).empty();
  261. // 显示按钮
  262. var id = 'pl_btn_select_' + idName;
  263. $('#' + id).show();
  264. });
  265. }
  266. /**
  267. * 遇到错误的话柄.
  268. * @param {*} idName
  269. * @param {*} up
  270. * @param {*} err
  271. */
  272. function pluploadFuncError(idName, up, err)
  273. {
  274. layui.use(['jquery', 'element', 'layer'], function () {
  275. let $ = layui.jquery;
  276. // 显示按钮
  277. var id = 'pl_btn_select_' + idName;
  278. $('#' + id).show();
  279. var hcode = '【'+ err.code +'】' + err.message;
  280. $('#pl_status_'+ idName).html(hcode);
  281. });
  282. }
  283. /**
  284. * 统一构造话柄的函数
  285. * @returns
  286. */
  287. function pluploadCallbackFuncForDemo()
  288. {
  289. return {
  290. UploadProgress: pluploadFuncUploadProgress,
  291. FileUploaded: pluploadFuncFileUploaded,
  292. UploadComplete: pluploadFuncUploadComplete,
  293. Error: pluploadFuncError
  294. }
  295. }
  296. /**
  297. * 单个文件上传函数
  298. * @param string idName 标识
  299. * @param Object cbFuncObjs 回掉函数对象.
  300. * @returns
  301. */
  302. function pluploadOneForDemo(idName, cbFuncObjs)
  303. {
  304. var mimeTypes = pluploadSelectMime('image'); // 定义可选择的文件类型
  305. var multipartParams = pluploadMultipartParamsForDemo();
  306. var chunkMaxSizeKb = 10 * 1024; // 10M
  307. var uploadMaxSizeKb = 100 * 1024; //100M
  308. return pluploadBase(idName, false, mimeTypes, multipartParams, chunkMaxSizeKb, uploadMaxSizeKb, false, cbFuncObjs);
  309. }
  310. /**
  311. * 多个文件上传函数
  312. * @param string idName 标识
  313. * @param Object cbFuncObjs 回掉函数对象.
  314. * @returns
  315. */
  316. function pluploadMultiForDemo(idName, cbFuncObjs)
  317. {
  318. var mimeTypes = pluploadSelectMime('all'); // 定义可选择的文件类型
  319. var multipartParams = pluploadMultipartParamsForDemo();
  320. var chunkMaxSizeKb = 12 * 1024; // 20M
  321. var uploadMaxSizeKb = 80 * 1024; //80M
  322. return pluploadBase(idName, true, mimeTypes, multipartParams, chunkMaxSizeKb, uploadMaxSizeKb, true, cbFuncObjs);
  323. }