Нет описания

upload.js 8.3KB

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