upload.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /** layui-v2.5.5 MIT License By https://www.layui.com */ ;
  2. layui.define("layer", function(e) {
  3. "use strict";
  4. var t = layui.$,
  5. i = layui.layer,
  6. n = layui.hint(),
  7. o = layui.device(),
  8. a = {
  9. config: {},
  10. set: function(e) {
  11. var i = this;
  12. return i.config = t.extend({}, i.config, e), i
  13. },
  14. on: function(e, t) {
  15. return layui.onevent.call(this, r, e, t)
  16. }
  17. },
  18. l = function() {
  19. var e = this;
  20. return {
  21. upload: function(t) {
  22. e.upload.call(e, t)
  23. },
  24. reload: function(t) {
  25. e.reload.call(e, t)
  26. },
  27. config: e.config
  28. }
  29. },
  30. r = "upload",
  31. u = "layui-upload-file",
  32. c = "layui-upload-form",
  33. f = "layui-upload-iframe",
  34. s = "layui-upload-choose",
  35. p = function(e) {
  36. var i = this;
  37. i.config = t.extend({}, i.config, a.config, e), i.render()
  38. };
  39. p.prototype.config = {
  40. accept: "images",
  41. exts: "",
  42. auto: !0,
  43. bindAction: "",
  44. url: "",
  45. field: "file",
  46. acceptMime: "",
  47. method: "post",
  48. data: {},
  49. drag: !0,
  50. size: 0,
  51. number: 0,
  52. multiple: !1
  53. }, p.prototype.render = function(e) {
  54. var i = this,
  55. e = i.config;
  56. e.elem = t(e.elem), e.bindAction = t(e.bindAction), i.file(), i.events()
  57. }, p.prototype.file = function() {
  58. var e = this,
  59. i = e.config,
  60. n = e.elemFile = t(['<input class="' + u + '" type="file" accept="' + i.acceptMime +
  61. '" name="' + i.field + '"', i.multiple ? " multiple" : "", ">"
  62. ].join("")),
  63. a = i.elem.next();
  64. (a.hasClass(u) || a.hasClass(c)) && a.remove(), o.ie && o.ie < 10 && i.elem.wrap(
  65. '<div class="layui-upload-wrap"></div>'), e.isFile() ? (e.elemFile = i.elem, i.field = i
  66. .elem[0].name) : i.elem.after(n), o.ie && o.ie < 10 && e.initIE()
  67. }, p.prototype.initIE = function() {
  68. var e = this,
  69. i = e.config,
  70. n = t('<iframe id="' + f + '" class="' + f + '" name="' + f + '" frameborder="0"></iframe>'),
  71. o = t(['<form target="' + f + '" class="' + c +
  72. '" method="post" key="set-mine" enctype="multipart/form-data" action="' + i.url + '">',
  73. "</form>"
  74. ].join(""));
  75. t("#" + f)[0] || t("body").append(n), i.elem.next().hasClass(c) || (e.elemFile.wrap(o), i.elem.next(
  76. "." + c).append(function() {
  77. var e = [];
  78. return layui.each(i.data, function(t, i) {
  79. i = "function" == typeof i ? i() : i, e.push(
  80. '<input type="hidden" name="' + t + '" value="' + i + '">')
  81. }), e.join("")
  82. }()))
  83. }, p.prototype.msg = function(e) {
  84. return i.msg(e, {
  85. icon: 2,
  86. shift: 6
  87. })
  88. }, p.prototype.isFile = function() {
  89. var e = this.config.elem[0];
  90. if (e) return "input" === e.tagName.toLocaleLowerCase() && "file" === e.type
  91. }, p.prototype.preview = function(e) {
  92. var t = this;
  93. window.FileReader && layui.each(t.chooseFiles, function(t, i) {
  94. var n = new FileReader;
  95. n.readAsDataURL(i), n.onload = function() {
  96. e && e(t, i, this.result)
  97. }
  98. })
  99. }, p.prototype.upload = function(e, i) {
  100. var n, a = this,
  101. l = a.config,
  102. r = a.elemFile[0],
  103. u = function() {
  104. var i = 0,
  105. n = 0,
  106. o = e || a.files || a.chooseFiles || r.files,
  107. u = function() {
  108. l.multiple && i + n === a.fileLength && "function" == typeof l.allDone && l
  109. .allDone({
  110. total: a.fileLength,
  111. successful: i,
  112. aborted: n
  113. })
  114. };
  115. layui.each(o, function(e, o) {
  116. var r = new FormData;
  117. r.append(l.field, o), layui.each(l.data, function(e, t) {
  118. t = "function" == typeof t ? t() : t, r.append(e, t)
  119. }), t.ajax({
  120. url: l.url,
  121. type: "post",
  122. data: r,
  123. contentType: !1,
  124. processData: !1,
  125. dataType: "json",
  126. headers: l.headers || {},
  127. success: function(t) {
  128. i++, d(e, t), u()
  129. },
  130. error: function(e) {
  131. n++, e.responseJSON && e.responseJSON.message ? a.msg(e.responseJSON.message) : a.msg("请求上传接口出现异常"), m(e), u()
  132. },
  133. xhr: function() {
  134. var e = new XMLHttpRequest;
  135. return e.upload.addEventListener("progress", function(e) {
  136. if (e.lengthComputable) {
  137. var t = Math.floor(e.loaded / e.total *
  138. 100);
  139. "function" == typeof l.progress && l
  140. .progress(t, e)
  141. }
  142. }), e
  143. }
  144. })
  145. })
  146. },
  147. c = function() {
  148. var e = t("#" + f);
  149. a.elemFile.parent().submit(), clearInterval(p.timer), p.timer = setInterval(function() {
  150. var t, i = e.contents().find("body");
  151. try {
  152. t = i.text()
  153. } catch (n) {
  154. a.msg("获取上传后的响应信息出现异常"), clearInterval(p.timer), m()
  155. }
  156. t && (clearInterval(p.timer), i.html(""), d(0, t))
  157. }, 30)
  158. },
  159. d = function(e, t) {
  160. if (a.elemFile.next("." + s).remove(), r.value = "", "object" != typeof t) try {
  161. t = JSON.parse(t)
  162. } catch (i) {
  163. return t = {}, a.msg("请对上传接口返回有效JSON")
  164. }
  165. "function" == typeof l.done && l.done(t, e || 0, function(e) {
  166. a.upload(e)
  167. })
  168. },
  169. m = function(e) {
  170. l.auto && (r.value = ""), "function" == typeof l.error && l.error(e || 0, function(e) {
  171. a.upload(e)
  172. })
  173. },
  174. h = l.exts,
  175. v = function() {
  176. var t = [];
  177. return layui.each(e || a.chooseFiles, function(e, i) {
  178. t.push(i.name)
  179. }), t
  180. }(),
  181. g = {
  182. preview: function(e) {
  183. a.preview(e)
  184. },
  185. upload: function(e, t) {
  186. var i = {};
  187. i[e] = t, a.upload(i)
  188. },
  189. pushFile: function() {
  190. return a.files = a.files || {}, layui.each(a.chooseFiles, function(e, t) {
  191. a.files[e] = t
  192. }), a.files
  193. },
  194. resetFile: function(e, t, i) {
  195. var n = new File([t], i);
  196. a.files = a.files || {}, a.files[e] = n
  197. }
  198. },
  199. y = function() {
  200. if ("choose" !== i && !l.auto || (l.choose && l.choose(g), "choose" !== i)) return l
  201. .before && l.before(g), o.ie ? o.ie > 9 ? u() : c() : void u()
  202. };
  203. if (v = 0 === v.length ? r.value.match(/[^\/\\]+\..+/g) || [] || "" : v, 0 !== v.length) {
  204. switch (l.accept) {
  205. case "file":
  206. if (h && !RegExp("\\w\\.(" + h + ")$", "i").test(escape(v))) return a.msg(
  207. "选择的文件中包含不支持的格式"), r.value = "";
  208. break;
  209. case "video":
  210. if (!RegExp("\\w\\.(" + (h || "avi|mp4|wma|rmvb|rm|flash|3gp|flv") + ")$", "i").test(
  211. escape(v))) return a.msg("选择的视频中包含不支持的格式"), r.value = "";
  212. break;
  213. case "audio":
  214. if (!RegExp("\\w\\.(" + (h || "mp3|wav|mid") + ")$", "i").test(escape(v))) return a.msg(
  215. "选择的音频中包含不支持的格式"), r.value = "";
  216. break;
  217. default:
  218. if (layui.each(v, function(e, t) {
  219. RegExp(".(" + (h || "jpg|png|gif|bmp|jpeg$") + ")", "i").test(escape(t)) ||
  220. (n = !0)
  221. }), n) return a.msg("选择的图片中包含不支持的格式"), r.value = ""
  222. }
  223. if (a.fileLength = function() {
  224. var t = 0,
  225. i = e || a.files || a.chooseFiles || r.files;
  226. return layui.each(i, function() {
  227. t++
  228. }), t
  229. }(), l.number && a.fileLength > l.number) return a.msg("同时最多只能上传的数量为:" + l.number);
  230. if (l.size > 0 && !(o.ie && o.ie < 10)) {
  231. var F;
  232. if (layui.each(a.chooseFiles, function(e, t) {
  233. if (t.size > 1024 * l.size) {
  234. var i = l.size / 1024;
  235. i = i >= 1 ? i.toFixed(2) + "MB" : l.size + "KB", r.value = "", F = i
  236. }
  237. }), F) return a.msg("文件不能超过" + F)
  238. }
  239. y()
  240. }
  241. }, p.prototype.reload = function(e) {
  242. e = e || {}, delete e.elem, delete e.bindAction;
  243. var i = this,
  244. e = i.config = t.extend({}, i.config, a.config, e),
  245. n = e.elem.next();
  246. n.attr({
  247. name: e.name,
  248. accept: e.acceptMime,
  249. multiple: e.multiple
  250. })
  251. }, p.prototype.events = function() {
  252. var e = this,
  253. i = e.config,
  254. a = function(t) {
  255. e.chooseFiles = {}, layui.each(t, function(t, i) {
  256. var n = (new Date).getTime();
  257. e.chooseFiles[n + "-" + t] = i
  258. })
  259. },
  260. l = function(t, n) {
  261. var o = e.elemFile,
  262. a = t.length > 1 ? t.length + "个文件" : (t[0] || {}).name || o[0].value.match(
  263. /[^\/\\]+\..+/g) || [] || "";
  264. o.next().hasClass(s) && o.next().remove(), e.upload(null, "choose"), e.isFile() || i
  265. .choose || o.after('<span class="layui-inline ' + s + '">' + a + "</span>")
  266. };
  267. i.elem.off("upload.start").on("upload.start", function() {
  268. var o = t(this),
  269. a = o.attr("lay-data");
  270. if (a) try {
  271. a = new Function("return " + a)(), e.config = t.extend({}, i, a)
  272. } catch (l) {
  273. n.error("Upload element property lay-data configuration item has a syntax error: " +
  274. a)
  275. }
  276. e.config.item = o, e.elemFile[0].click()
  277. }), o.ie && o.ie < 10 || i.elem.off("upload.over").on("upload.over", function() {
  278. var e = t(this);
  279. e.attr("lay-over", "")
  280. }).off("upload.leave").on("upload.leave", function() {
  281. var e = t(this);
  282. e.removeAttr("lay-over")
  283. }).off("upload.drop").on("upload.drop", function(n, o) {
  284. var r = t(this),
  285. u = o.originalEvent.dataTransfer.files || [];
  286. r.removeAttr("lay-over"), a(u), i.auto ? e.upload(u) : l(u)
  287. }), e.elemFile.off("upload.change").on("upload.change", function() {
  288. var t = this.files || [];
  289. a(t), i.auto ? e.upload() : l(t)
  290. }), i.bindAction.off("upload.action").on("upload.action", function() {
  291. e.upload()
  292. }), i.elem.data("haveEvents") || (e.elemFile.on("change", function() {
  293. t(this).trigger("upload.change")
  294. }), i.elem.on("click", function() {
  295. e.isFile() || t(this).trigger("upload.start")
  296. }), i.drag && i.elem.on("dragover", function(e) {
  297. e.preventDefault(), t(this).trigger("upload.over")
  298. }).on("dragleave", function(e) {
  299. t(this).trigger("upload.leave")
  300. }).on("drop", function(e) {
  301. e.preventDefault(), t(this).trigger("upload.drop", e)
  302. }), i.bindAction.on("click", function() {
  303. t(this).trigger("upload.action")
  304. }), i.elem.data("haveEvents", !0))
  305. }, a.render = function(e) {
  306. var t = new p(e);
  307. return l.call(t)
  308. }, e(r, a)
  309. });