upload.html 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>镜像站@图片/文件上传模块文档 - Layui</title>
  6. <meta name="renderer" content="webkit">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  10. <meta name="apple-mobile-web-app-capable" content="yes">
  11. <meta name="format-detection" content="telephone=no">
  12. <script>
  13. ;!function(){self!==parent&&(location.href="http://www.baidu.com/")}();
  14. </script>
  15. <link rel="stylesheet" href="/public/layui/dist/css/layui.css" tppabs="http://res.layui.com/layui/dist/css/layui.css?t=1632428048260" media="all">
  16. <link rel="stylesheet" href="/public/static/css/global.css" tppabs="http://res.layui.com/static/css/global.css?t=1632428048260-19" media="all">
  17. </head>
  18. <body>
  19. <div class="layui-header header header-doc" autumn>
  20. <div class="layui-container">
  21. <a class="logo" href="../../index.html" tppabs="http://www.layui.com/">
  22. <img src="/public/static/images/layui/logo.png" tppabs="http://res.layui.com/static/images/layui/logo.png" alt="layui">
  23. </a>
  24. <div class="layui-form layui-hide-xs component" lay-filter="LAY-site-header-component"></div>
  25. <div class="layui-hide-xs site-notice"></div>
  26. <ul class="layui-nav" id="LAY_NAV_TOP">
  27. <li class="layui-nav-item layui-this">
  28. <a href="../index.html" tppabs="http://www.layui.com/doc/">文档</a>
  29. </li>
  30. <li class="layui-nav-item ">
  31. <a href="../../demo/index.html" tppabs="http://www.layui.com/demo/">示例</a>
  32. </li>
  33. <li class="layui-nav-item">
  34. <a href="javascript:;">
  35. <!--<span class="layui-badge-dot" style="left:0; right: auto; margin: -4px 0 0 5px;"></span>-->
  36. 周边
  37. </a>
  38. <dl class="layui-nav-child layui-nav-child-c">
  39. <dd class="layui-hide-sm layui-show-xs" lay-unselect>
  40. <a href="https://gitee.com/sentsin/layui/issues" target="_blank" rel="nofollow">问题反馈</a>
  41. <hr>
  42. </dd>
  43. <dd lay-unselect><a href="../../alone.html" tppabs="http://www.layui.com/alone.html" target="_blank" lay-unselect>独立组件</a></dd>
  44. <dd lay-unselect><a href="../../../fly.layui.com/extend/index.html" target="_blank">扩展组件</a></dd>
  45. </dl>
  46. </li>
  47. <li class="layui-nav-item layui-hide-xs">
  48. <a href="http://gitee.com/sentsin/layui/issues" target="_blank" rel="nofollow">反馈</a>
  49. </li>
  50. </ul>
  51. </div>
  52. </div>
  53. <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
  54. <!--[if lt IE 9]>
  55. <script src="../../../other/html5shiv/r29/html5.min.js" tppabs="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
  56. <script src="../../../other/respond.js/1.4.2/respond.min.js" tppabs="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
  57. <![endif]-->
  58. <ul class="site-dir">
  59. <li><a href="#use"><cite>快速使用</cite></a></li>
  60. <li>
  61. <a href="#options">
  62. <cite>基础参数选项</cite>
  63. </a>
  64. </li>
  65. <li><a href="#api"><cite>上传接口</cite></a></li>
  66. <li><a href="#choose"><cite>回调</cite></a></li>
  67. <ul style="margin-left: 15px;">
  68. <li><a href="#choose"><cite>选择文件的回调</cite></a></li>
  69. <li><a href="#before"><cite>上传前的回调</cite></a></li>
  70. <li><a href="#done"><cite>请求成功的回调</cite></a></li>
  71. <li><a href="#error"><cite>请求失败的回调</cite></a></li>
  72. <li><a href="#allDone"><cite>多文件上传回调</cite></a></li>
  73. <li><a href="#progress"><cite>上传进度的回调</cite> <span class="layui-badge-dot"></span></a></li>
  74. </ul>
  75. <li><a href="#reload"><cite>重载实例</cite> <span class="layui-badge-dot"></span></a></li>
  76. <li><a href="#reUpload"><cite>重新上传</cite></a></li>
  77. <li><a href="#corsUpload"><cite>跨域上传</cite></a></li>
  78. </ul>
  79. <div class="layui-container layui-row">
  80. <div class="layui-col-md3">
  81. <div class="layui-panel site-menu">
  82. <ul class="layui-menu layui-menu-lg">
  83. <li class="layui-menu-item-group" lay-options="{type: 'group', isAllowSpread: true}">
  84. <div class="layui-menu-body-title">
  85. 基础说明
  86. </div>
  87. <hr>
  88. <ul>
  89. <li class="">
  90. <div class="layui-menu-body-title">
  91. <a href="../index.html" tppabs="http://www.layui.com/doc/">
  92. <span>开始使用 </span>
  93. <span class="layui-font-12 layui-font-gray">Getting Started</span>
  94. </a>
  95. </div>
  96. </li>
  97. <li class="">
  98. <div class="layui-menu-body-title">
  99. <a href="../base/infrastructure.html" tppabs="http://www.layui.com/doc/base/infrastructure.html">
  100. <span>底层方法 </span>
  101. <span class="layui-font-12 layui-font-gray">基础支撑</span>
  102. </a>
  103. </div>
  104. </li>
  105. <li class="">
  106. <div class="layui-menu-body-title">
  107. <a href="../base/element.html" tppabs="http://www.layui.com/doc/base/element.html">
  108. <span>页面元素 </span>
  109. <span class="layui-font-12 layui-font-gray">规范 公共类 属性</span>
  110. </a>
  111. </div>
  112. </li>
  113. <li class="">
  114. <div class="layui-menu-body-title">
  115. <a href="../base/modules.html" tppabs="http://www.layui.com/doc/base/modules.html">
  116. <span>模块规范 </span>
  117. <span class="layui-font-12 layui-font-gray">使用 扩展</span>
  118. </a>
  119. </div>
  120. </li>
  121. <li class="">
  122. <div class="layui-menu-body-title">
  123. <a href="../base/faq.html" tppabs="http://www.layui.com/doc/base/faq.html">
  124. <span>常见问题 </span>
  125. <span class="layui-font-12 layui-font-gray">FAQ</span>
  126. </a>
  127. </div>
  128. </li>
  129. <li class="">
  130. <div class="layui-menu-body-title">
  131. <a href="../base/changelog.html" tppabs="http://www.layui.com/doc/base/changelog.html">
  132. <span>更新日志 </span>
  133. <span class="layui-font-12 layui-font-gray">changelog</span>
  134. <span class="layui-badge-dot"></span>
  135. </a>
  136. </div>
  137. </li>
  138. </ul>
  139. </li>
  140. <li class="layui-menu-item-group" lay-options="{type: 'group', isAllowSpread: true}">
  141. <div class="layui-menu-body-title">
  142. 页面元素
  143. </div>
  144. <hr>
  145. <ul>
  146. <li class="">
  147. <div class="layui-menu-body-title">
  148. <a href="../element/layout.html" tppabs="http://www.layui.com/doc/element/layout.html">
  149. <span>布局 </span>
  150. <span class="layui-font-12 layui-font-gray">栅格 后台管理布局</span>
  151. </a>
  152. </div>
  153. </li>
  154. <li class="">
  155. <div class="layui-menu-body-title">
  156. <a href="../element/color.html" tppabs="http://www.layui.com/doc/element/color.html">
  157. <span>颜色 </span>
  158. <span class="layui-font-12 layui-font-gray">主色调 颜色搭配</span>
  159. </a>
  160. </div>
  161. </li>
  162. <li class="">
  163. <div class="layui-menu-body-title">
  164. <a href="../element/icon.html" tppabs="http://www.layui.com/doc/element/icon.html">
  165. <span>图标 </span>
  166. <span class="layui-font-12 layui-font-gray">iconfont 字体图标</span>
  167. </a>
  168. </div>
  169. </li>
  170. <li class="">
  171. <div class="layui-menu-body-title">
  172. <a href="../element/anim.html" tppabs="http://www.layui.com/doc/element/anim.html">
  173. <span>动画 </span>
  174. <span class="layui-font-12 layui-font-gray">内置 CSS3 动画</span>
  175. </a>
  176. </div>
  177. </li>
  178. <li class="">
  179. <div class="layui-menu-body-title">
  180. <a href="../element/button.html" tppabs="http://www.layui.com/doc/element/button.html">
  181. <span>按钮 </span>
  182. <span class="layui-font-12 layui-font-gray">button</span>
  183. </a>
  184. </div>
  185. </li>
  186. <li class="">
  187. <div class="layui-menu-body-title">
  188. <a href="../element/form.html" tppabs="http://www.layui.com/doc/element/form.html">
  189. <span>表单 </span>
  190. <span class="layui-font-12 layui-font-gray">form 元素集合</span>
  191. </a>
  192. </div>
  193. </li>
  194. <li class="">
  195. <div class="layui-menu-body-title">
  196. <a href="../element/nav.html" tppabs="http://www.layui.com/doc/element/nav.html">
  197. <span>导航 </span>
  198. <span class="layui-font-12 layui-font-gray">nav 面包屑</span>
  199. </a>
  200. </div>
  201. </li>
  202. <li class="">
  203. <div class="layui-menu-body-title">
  204. <a href="../element/menu.html" tppabs="http://www.layui.com/doc/element/menu.html">
  205. <span>菜单 </span>
  206. <span class="layui-font-12 layui-font-gray">menu 基础菜单</span>
  207. <span class="layui-badge-dot"></span>
  208. </a>
  209. </div>
  210. </li>
  211. <li class="">
  212. <div class="layui-menu-body-title">
  213. <a href="../element/tab.html" tppabs="http://www.layui.com/doc/element/tab.html">
  214. <span>选项卡 </span>
  215. <span class="layui-font-12 layui-font-gray">Tabs 切换</span>
  216. </a>
  217. </div>
  218. </li>
  219. <li class="">
  220. <div class="layui-menu-body-title">
  221. <a href="../element/progress.html" tppabs="http://www.layui.com/doc/element/progress.html">
  222. <span>进度条 </span>
  223. <span class="layui-font-12 layui-font-gray">progress</span>
  224. </a>
  225. </div>
  226. </li>
  227. <li class="">
  228. <div class="layui-menu-body-title">
  229. <a href="../element/panel.html" tppabs="http://www.layui.com/doc/element/panel.html">
  230. <span>面板 </span>
  231. <span class="layui-font-12 layui-font-gray">panel 卡片 折叠</span>
  232. </a>
  233. </div>
  234. </li>
  235. <li class="">
  236. <div class="layui-menu-body-title">
  237. <a href="../element/table.html" tppabs="http://www.layui.com/doc/element/table.html">
  238. <span>表格 </span>
  239. <span class="layui-font-12 layui-font-gray">静态 table</span>
  240. </a>
  241. </div>
  242. </li>
  243. <li class="">
  244. <div class="layui-menu-body-title">
  245. <a href="../element/badge.html" tppabs="http://www.layui.com/doc/element/badge.html">
  246. <span>徽章 </span>
  247. <span class="layui-font-12 layui-font-gray">小圆点 小边框</span>
  248. </a>
  249. </div>
  250. </li>
  251. <li class="">
  252. <div class="layui-menu-body-title">
  253. <a href="../element/timeline.html" tppabs="http://www.layui.com/doc/element/timeline.html">
  254. <span>时间线 </span>
  255. <span class="layui-font-12 layui-font-gray">timeline</span>
  256. </a>
  257. </div>
  258. </li>
  259. <li class="">
  260. <div class="layui-menu-body-title">
  261. <a href="../element/auxiliar.html" tppabs="http://www.layui.com/doc/element/auxiliar.html">
  262. <span>辅助 </span>
  263. <span class="layui-font-12 layui-font-gray">引用 字段集 横线等</span>
  264. </a>
  265. </div>
  266. </li>
  267. </ul>
  268. </li>
  269. <li class="layui-menu-item-group" lay-options="{type: 'group', isAllowSpread: true}">
  270. <div class="layui-menu-body-title">
  271. 内置模块
  272. </div>
  273. <hr>
  274. <ul>
  275. <li class="">
  276. <div class="layui-menu-body-title">
  277. <a href="layer.html" tppabs="http://www.layui.com/doc/modules/layer.html">
  278. <span>弹出层 </span>
  279. <span class="layui-font-12 layui-font-gray">layer</span>
  280. </a>
  281. </div>
  282. </li>
  283. <li class="">
  284. <div class="layui-menu-body-title">
  285. <a href="laydate.html" tppabs="http://www.layui.com/doc/modules/laydate.html">
  286. <span>日期与时间选择 </span>
  287. <span class="layui-font-12 layui-font-gray">laydate</span>
  288. </a>
  289. </div>
  290. </li>
  291. <li class="">
  292. <div class="layui-menu-body-title">
  293. <a href="laypage.html" tppabs="http://www.layui.com/doc/modules/laypage.html">
  294. <span>分页 </span>
  295. <span class="layui-font-12 layui-font-gray">laypage</span>
  296. </a>
  297. </div>
  298. </li>
  299. <li class="">
  300. <div class="layui-menu-body-title">
  301. <a href="laytpl.html" tppabs="http://www.layui.com/doc/modules/laytpl.html">
  302. <span>模板引擎 </span>
  303. <span class="layui-font-12 layui-font-gray">laytpl</span>
  304. </a>
  305. </div>
  306. </li>
  307. <li class="">
  308. <div class="layui-menu-body-title">
  309. <a href="table.html" tppabs="http://www.layui.com/doc/modules/table.html">
  310. <span>数据表格 </span>
  311. <span class="layui-font-12 layui-font-gray">table</span>
  312. </a>
  313. </div>
  314. </li>
  315. <li class="">
  316. <div class="layui-menu-body-title">
  317. <a href="form.html" tppabs="http://www.layui.com/doc/modules/form.html">
  318. <span>表单 </span>
  319. <span class="layui-font-12 layui-font-gray">form</span>
  320. </a>
  321. </div>
  322. </li>
  323. <li class="layui-menu-item-checked2">
  324. <div class="layui-menu-body-title">
  325. <a href="upload.html" tppabs="http://www.layui.com/doc/modules/upload.html">
  326. <span>文件上传 </span>
  327. <span class="layui-font-12 layui-font-gray">upload</span>
  328. </a>
  329. </div>
  330. </li>
  331. <li class="">
  332. <div class="layui-menu-body-title">
  333. <a href="dropdown.html" tppabs="http://www.layui.com/doc/modules/dropdown.html">
  334. <span>下拉菜单 </span>
  335. <span class="layui-font-12 layui-font-gray">dropdown</span>
  336. <span class="layui-badge-dot"></span>
  337. </a>
  338. </div>
  339. </li>
  340. <li class="">
  341. <div class="layui-menu-body-title">
  342. <a href="transfer.html" tppabs="http://www.layui.com/doc/modules/transfer.html">
  343. <span>穿梭框 </span>
  344. <span class="layui-font-12 layui-font-gray">transfer</span>
  345. </a>
  346. </div>
  347. </li>
  348. <li class="">
  349. <div class="layui-menu-body-title">
  350. <a href="tree.html" tppabs="http://www.layui.com/doc/modules/tree.html">
  351. <span>树形组件 </span>
  352. <span class="layui-font-12 layui-font-gray">tree</span>
  353. </a>
  354. </div>
  355. </li>
  356. <li class="">
  357. <div class="layui-menu-body-title">
  358. <a href="colorpicker.html" tppabs="http://www.layui.com/doc/modules/colorpicker.html">
  359. <span>颜色选择器 </span>
  360. <span class="layui-font-12 layui-font-gray">colorpicker</span>
  361. </a>
  362. </div>
  363. </li>
  364. <li class="">
  365. <div class="layui-menu-body-title">
  366. <a href="element.html" tppabs="http://www.layui.com/doc/modules/element.html">
  367. <span>常用元素操作 </span>
  368. <span class="layui-font-12 layui-font-gray">element</span>
  369. </a>
  370. </div>
  371. </li>
  372. <li class="">
  373. <div class="layui-menu-body-title">
  374. <a href="slider.html" tppabs="http://www.layui.com/doc/modules/slider.html">
  375. <span>滑块 </span>
  376. <span class="layui-font-12 layui-font-gray">slider</span>
  377. </a>
  378. </div>
  379. </li>
  380. <li class="">
  381. <div class="layui-menu-body-title">
  382. <a href="rate.html" tppabs="http://www.layui.com/doc/modules/rate.html">
  383. <span>评分 </span>
  384. <span class="layui-font-12 layui-font-gray">rate</span>
  385. </a>
  386. </div>
  387. </li>
  388. <li class="">
  389. <div class="layui-menu-body-title">
  390. <a href="carousel.html" tppabs="http://www.layui.com/doc/modules/carousel.html">
  391. <span>轮播 </span>
  392. <span class="layui-font-12 layui-font-gray">carousel</span>
  393. </a>
  394. </div>
  395. </li>
  396. <li class="">
  397. <div class="layui-menu-body-title">
  398. <a href="layedit.html" tppabs="http://www.layui.com/doc/modules/layedit.html">
  399. <span>富文本编辑器 </span>
  400. <span class="layui-font-12 layui-font-gray">layedit</span>
  401. </a>
  402. </div>
  403. </li>
  404. <li class="">
  405. <div class="layui-menu-body-title">
  406. <a href="flow.html" tppabs="http://www.layui.com/doc/modules/flow.html">
  407. <span>流加载 </span>
  408. <span class="layui-font-12 layui-font-gray">flow</span>
  409. </a>
  410. </div>
  411. </li>
  412. <li class="">
  413. <div class="layui-menu-body-title">
  414. <a href="util.html" tppabs="http://www.layui.com/doc/modules/util.html">
  415. <span>工具组件 </span>
  416. <span class="layui-font-12 layui-font-gray">util</span>
  417. </a>
  418. </div>
  419. </li>
  420. <li class="">
  421. <div class="layui-menu-body-title">
  422. <a href="code.html" tppabs="http://www.layui.com/doc/modules/code.html">
  423. <span>代码高亮显示 </span>
  424. <span class="layui-font-12 layui-font-gray">code</span>
  425. </a>
  426. </div>
  427. </li>
  428. </ul>
  429. </li>
  430. </ul>
  431. </div>
  432. <div class="layui-hide-v"> - </div>
  433. </div>
  434. <div class="layui-col-md9 site-content">
  435. <h1 class="site-h1"><i class="layui-icon">&#xe62f;</i> 图片/文件上传 - layui.upload</h1>
  436. <div class="site-tips site-text">
  437. <p>上传模块自 layui 2.0 的版本开始,进行了全面重写,这使得它不再那么单一,它所包含的不仅是更为强劲的功能,还有灵活的 UI。任何元素都可以作为上传组件来调用,譬如按钮、图片、普通的 DIV 等等,而不再是一个单调的 file 文件域。</p>
  438. </div>
  439. <div class="site-tips site-text">
  440. <p>模块加载名称:<em>upload</em></p>
  441. </div>
  442. <fieldset class="layui-elem-field layui-field-title site-title">
  443. <legend><a name="use">快速使用</a></legend>
  444. </fieldset>
  445. <div class="site-text">
  446. <p>一切从小试牛刀开始。通常情况下,我们上传文件是借助 type="file" 的 input 标签来完成的,但非常遗憾的是,它不能很好地与其它表单元素并存,所以我们常常要单独为它做一个业务层面的“异步上传”,即先让图片上传,再和其它表单一起提交保存。下面是一个小示例:</p>
  447. <p>
  448. <button type="button" class="layui-btn" id="test1">
  449. <i class="layui-icon">&#xe67c;</i>上传图片
  450. </button>
  451. </p>
  452. <p>这原本只是一个普通的 button,正是 upload 模块赋予了它“文件选择”的特殊技能。当然,你还可以随意定制它的样式,而不是只局限于按钮。</p>
  453. <pre class="layui-code" lay-title="对应的代码">
  454. &lt;!DOCTYPE html&gt;
  455. &lt;html&gt;
  456. &lt;head&gt;
  457. &lt;meta charset=&quot;utf-8&quot;&gt;
  458. &lt;title&gt;upload模块快速使用&lt;/title&gt;
  459. &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/build/layui.css&quot; media=&quot;all&quot;&gt;
  460. &lt;/head&gt;
  461. &lt;body&gt;
  462. &lt;button type="button" class="layui-btn" id="test1">
  463. &lt;i class="layui-icon">&amp;#xe67c;&lt;/i>上传图片
  464. &lt;/button>
  465. &lt;script src=&quot;/static/build/layui.js&quot;&gt;&lt;/script&gt;
  466. &lt;script&gt;
  467. layui.use(&#x27;upload&#x27;, function(){
  468. var upload = layui.upload;
  469. //执行实例
  470. var uploadInst = upload.render({
  471. elem: '#test1' //绑定元素
  472. ,url: '/upload/' //上传接口
  473. ,done: function(res){
  474. //上传完毕回调
  475. }
  476. ,error: function(){
  477. //请求异常回调
  478. }
  479. });
  480. });
  481. &lt;/script&gt;
  482. &lt;/body&gt;
  483. &lt;/html&gt;</pre>
  484. <p>一切看起来是那样的简单,乃至于我不得不凑一段文字来填充这一行的版面。这样好像与下文衔接起来会比较谐调的样子(自我感觉)</p>
  485. </div>
  486. <fieldset class="layui-elem-field layui-field-title site-title">
  487. <legend><a name="options">核心方法与基础参数选项</a></legend>
  488. </fieldset>
  489. <div class="site-text">
  490. <p>使用 upload 模块必须与 <em>upload.render(options)</em> 方法打交道,其中的 <em>options</em>即为基础参数,它是一个对象。</p>
  491. <pre class="layui-code">
  492. var upload = layui.upload; //得到 upload 对象
  493. //创建一个上传组件
  494. upload.render({
  495. elem: '#id'
  496. ,url: ''
  497. ,done: function(res, index, upload){ //上传后的回调
  498. }
  499. //,accept: 'file' //允许上传的文件类型
  500. //,size: 50 //最大允许上传的文件大小
  501. //,……
  502. })
  503. </pre>
  504. <p>从 layui 2.1.0 开始,允许你直接在元素上设定基础参数,如:</p>
  505. <pre class="layui-code">
  506. 【HTML】
  507. &lt;button class="layui-btn test" lay-data="{url: '/a/'}"&gt;上传图片&lt;/button&gt;
  508. &lt;button class="layui-btn test" lay-data="{url: '/b/', accept: 'file'}"&gt;上传文件&lt;/button&gt;
  509. 【JS】
  510. upload.render({
  511. elem: '.test'
  512. ,done: function(res, index, upload){
  513. //获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增
  514. var item = this.item;
  515. }
  516. })
  517. </pre>
  518. <p>更多支持的参数详见下表,合理的配置它们,应对各式各样的业务需求。<p>
  519. <table class="layui-table">
  520. <colgroup>
  521. <col width="120">
  522. <col>
  523. <col width="120">
  524. <col width="200">
  525. </colgroup>
  526. <thead>
  527. <tr>
  528. <th>参数选项</th>
  529. <th>说明</th>
  530. <th>类型</th>
  531. <th>默认值</th>
  532. </tr>
  533. </thead>
  534. <tbody>
  535. <tr>
  536. <td>elem</td>
  537. <td>指向容器选择器,如:elem: '#id'。也可以是DOM对象</td>
  538. <td>string/object</td>
  539. <td>-</td>
  540. </tr>
  541. <tr>
  542. <td>url</td>
  543. <td>服务端上传接口,返回的数据规范请详见下文</td>
  544. <td>string</td>
  545. <td>-</td>
  546. </tr>
  547. <!--<tr>
  548. <td>method</td>
  549. <td>上传接口的 HTTP 类型</td>
  550. <td>string</td>
  551. <td>post</td>
  552. </tr>-->
  553. <tr>
  554. <td>data <a name="data"></a></td>
  555. <td>请求上传接口的额外参数。如:data: {id: 'xxx'}
  556. <br> 从 layui 2.2.6 开始,支持动态值,如:
  557. <pre class="layui-code">
  558. data: {
  559. id: function(){
  560. return $('#id').val();
  561. }
  562. }
  563. </pre>
  564. </td>
  565. <td>object</td>
  566. <td>-</td>
  567. </tr>
  568. <tr>
  569. <td>headers</td>
  570. <td>接口的请求头。如:<em>headers: {token: 'sasasas'}</em>。注:该参数为 layui 2.2.6 开始新增</td>
  571. </tr>
  572. <tr>
  573. <td>accept</td>
  574. <td>指定允许上传时校验的文件类型,可选值有:<em>images</em>(图片)、<em>file</em>(所有文件)、<em>video</em>(视频)、<em>audio</em>(音频)</td>
  575. <td>string</td>
  576. <td>images</td>
  577. </tr>
  578. <tr>
  579. <td>acceptMime <a name="acceptMime"></a></td>
  580. <td>规定打开文件选择框时,筛选出的文件类型,值为用逗号隔开的 MIME 类型列表。如:
  581. <br><em>acceptMime: 'image/*'</em>(只显示图片文件)
  582. <br><em>acceptMime: 'image/jpg, image/png'</em>(只显示 jpg 和 png 文件)
  583. <br><span style="color: #FF5722;">注:该参数为 layui 2.2.6 开始新增</span></td>
  584. <td>string</td>
  585. <td>images</td>
  586. </tr>
  587. <tr>
  588. <td>exts</td>
  589. <td>允许上传的文件后缀。一般结合 <em>accept</em> 参数类设定。假设 accept 为 file 类型时,那么你设置 <em>exts: 'zip|rar|7z'</em> 即代表只允许上传压缩格式的文件。如果 accept 未设定,那么限制的就是图片的文件格式</td>
  590. <td>string</td>
  591. <td>jpg|png|gif|bmp|jpeg</td>
  592. </tr>
  593. <tr>
  594. <td>auto</td>
  595. <td>是否选完文件后自动上传。如果设定 <em>false</em>,那么需要设置 <em>bindAction</em> 参数来指向一个其它按钮提交上传</td>
  596. <td>boolean</td>
  597. <td>true</td>
  598. </tr>
  599. <tr>
  600. <td>bindAction</td>
  601. <td>指向一个按钮触发上传,一般配合 auto: false 来使用。值为选择器或DOM对象,如:bindAction: '#btn'</td>
  602. <td>string/object</td>
  603. <td>-</td>
  604. </tr>
  605. <tr>
  606. <td>field</td>
  607. <td>设定文件域的字段名</td>
  608. <td>string</td>
  609. <td>file</td>
  610. </tr>
  611. <tr>
  612. <td>size</td>
  613. <td>设置文件最大可允许上传的大小,单位 KB。不支持ie8/9</td>
  614. <td>number</td>
  615. <td>0(即不限制)</td>
  616. </tr>
  617. <tr>
  618. <td>multiple</td>
  619. <td>是否允许多文件上传。设置 <em>true</em>即可开启。不支持ie8/9</td>
  620. <td>boolean</td>
  621. <td>false</td>
  622. </tr>
  623. <tr>
  624. <td>number</td>
  625. <td>设置同时可上传的文件数量,一般配合 multiple 参数出现。<br>注意:<em>该参数为 layui 2.2.3 开始新增</em></td>
  626. <td>number</td>
  627. <td>0(即不限制)</td>
  628. </tr>
  629. <tr>
  630. <td>drag</td>
  631. <td>是否接受拖拽的文件上传,设置 <em>false</em> 可禁用。不支持ie8/9</td>
  632. <td>boolean</td>
  633. <td>true</td>
  634. </tr>
  635. <tr><td colspan="4" style="text-align: center;">回调</td></tr>
  636. <tr>
  637. <td>choose</td>
  638. <td>选择文件后的回调函数。返回一个object参数,详见下文</td>
  639. <td>function</td>
  640. <td>-</td>
  641. </tr>
  642. <tr>
  643. <td>before</td>
  644. <td>文件提交上传前的回调。返回一个object参数(同上),详见下文</td>
  645. <td>function</td>
  646. <td>-</td>
  647. </tr>
  648. <tr>
  649. <td>done</td>
  650. <td>执行上传请求后的回调。返回三个参数,分别为:<em>res</em>(服务端响应信息)、<em>index</em>(当前文件的索引)、<em>upload</em>(重新上传的方法,一般在文件上传失败后使用)。详见下文</td>
  651. <td>function</td>
  652. <td>-</td>
  653. </tr>
  654. <tr>
  655. <td>error</td>
  656. <td>执行上传请求出现异常的回调(一般为网络异常、URL 404等)。返回两个参数,分别为:<em>index</em>(当前文件的索引)、<em>upload</em>(重新上传的方法)。详见下文</td>
  657. <td>function</td>
  658. <td>-</td>
  659. </tr>
  660. </tbody>
  661. </table>
  662. </div>
  663. <fieldset class="layui-elem-field layui-field-title site-title">
  664. <legend><a name="api">上传接口</a></legend>
  665. </fieldset>
  666. <div class="site-text">
  667. <p>设定一个 URL 地址给 <em>url</em> 参数,用来告诉 upload 模块的服务端上传接口。像你平时使用Ajax一样。如:</p>
  668. <pre class="layui-code">
  669. upload.render({
  670. elem: '#id'
  671. ,url: '/api/upload/' //必填项
  672. ,method: '' //可选项。HTTP类型,默认post
  673. ,data: {} //可选项。额外的参数,如:{id: 123, abc: 'xxx'}
  674. });
  675. </pre>
  676. <p>该接口返回的相应信息(response)必须是一个标准的 JSON 格式,如:</p>
  677. <pre class="layui-code" lay-title="Response" lay-skin="notepad">
  678. {
  679. "code": 0
  680. ,"msg": ""
  681. ,"data": {
  682. "src": "http://cdn.layui.com/123.jpg"
  683. }
  684. }
  685. </pre>
  686. <p style="color: #FF5722;">
  687. 注意1:你不一定非得按照上述格式返回,只要是合法的 JSON 字符即可。其响应信息会转化成JS对象传递给 <em>done</em> 回调。
  688. <br>注意2:如果上传后,出现文件下载框(一般为ie下),那么你需要在服务端对response的header设置 <em>Content-Type: text/html</em>
  689. </p>
  690. </div>
  691. <fieldset class="layui-elem-field layui-field-title site-title">
  692. <legend><a name="choose">选择文件的回调</a></legend>
  693. </fieldset>
  694. <div class="site-text">
  695. <p>在文件被选择后触发,该回调会在 before 回调之前。一般用于非自动上传(即 <em>auto: false</em> )的场景,比如预览图片等。</p>
  696. <pre class="layui-code">
  697. upload.render({
  698. elem: '#id'
  699. ,url: '/api/upload/'
  700. ,auto: false //选择文件后不自动上传
  701. ,bindAction: '#testListAction' //指向一个按钮触发上传
  702. ,choose: function(obj){
  703. //将每次选择的文件追加到文件队列
  704. var files = obj.pushFile();
  705. //预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
  706. obj.preview(function(index, file, result){
  707. console.log(index); //得到文件索引
  708. console.log(file); //得到文件对象
  709. console.log(result); //得到文件base64编码,比如图片
  710. //obj.resetFile(index, file, '123.jpg'); //重命名文件名,layui 2.3.0 开始新增
  711. //这里还可以做一些 append 文件列表 DOM 的操作
  712. //obj.upload(index, file); //对上传失败的单个文件重新上传,一般在某个事件中使用
  713. //delete files[index]; //删除列表中对应的文件,一般在某个事件中使用
  714. });
  715. }
  716. });
  717. </pre>
  718. <p>事实上这是一个非常实用的存在,可轻松应对复杂的列表文件上传管理。具体可移步到 示例 页面,里面有一个文件列表的小例子。</p>
  719. </div>
  720. <fieldset class="layui-elem-field layui-field-title site-title">
  721. <legend><a name="before">文件上传前的回调</a></legend>
  722. </fieldset>
  723. <div class="site-text">
  724. <p>在 <em>choose</em> 回调之后、<em>done/error</em> 回调之前触发。返回的参数完全类似 choose 回调。一般用于上传完毕前的loading、图片预览等。</p>
  725. <pre class="layui-code">
  726. upload.render({
  727. elem: '#id'
  728. ,url: '/api/upload/'
  729. ,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
  730. layer.load(); //上传loading
  731. }
  732. ,done: function(res, index, upload){
  733. layer.closeAll('loading'); //关闭loading
  734. }
  735. ,error: function(index, upload){
  736. layer.closeAll('loading'); //关闭loading
  737. }
  738. });
  739. </pre>
  740. </div>
  741. <fieldset class="layui-elem-field layui-field-title site-title">
  742. <legend><a name="done">上传接口请求成功的回调</a></legend>
  743. </fieldset>
  744. <div class="site-text">
  745. <p>在上传接口请求完毕后触发,但文件不一定是上传成功的,只是接口的响应状态正常(200)。回调返回三个参数,分别为:<em>服务端响应信息</em>、<em>当前文件的索引</em>、<em>重新上传的方法</em></p>
  746. <pre class="layui-code">
  747. upload.render({
  748. elem: '#id'
  749. ,url: '/api/upload/'
  750. ,done: function(res, index, upload){
  751. //假设code=0代表上传成功
  752. if(res.code == 0){
  753. //do something (比如将res返回的图片链接保存到表单的隐藏域)
  754. }
  755. //获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增
  756. var item = this.item;
  757. //文件保存失败
  758. //do something
  759. }
  760. });
  761. </pre>
  762. </div>
  763. <fieldset class="layui-elem-field layui-field-title site-title">
  764. <legend><a name="error">上传请求失败的回调</a></legend>
  765. </fieldset>
  766. <div class="site-text">
  767. <p>当请求上传时出现异常时触发(如网络异常、404/500等)。回调返回两个参数,分别为:<em>当前文件的索引</em>、<em>重新上传的方法</em></p>
  768. <pre class="layui-code">
  769. upload.render({
  770. elem: '#id'
  771. ,url: '/api/upload/'
  772. ,error: function(index, upload){
  773. //当上传失败时,你可以生成一个“重新上传”的按钮,点击该按钮时,执行 upload() 方法即可实现重新上传
  774. }
  775. });
  776. </pre>
  777. </div>
  778. <fieldset class="layui-elem-field layui-field-title site-title">
  779. <legend><a name="allDone">多文件上传完毕后的状态回调</a></legend>
  780. </fieldset>
  781. <div class="site-text">
  782. <p>只有当开启多文件时(即 multiple: true),该回调才会被触发。回调返回一个 object 类型的参数,包含一些状态数据:</p>
  783. <pre class="layui-code">
  784. upload.render({
  785. elem: '#id'
  786. ,url: '/api/upload/'
  787. ,multiple: true
  788. ,allDone: function(obj){ //当文件全部被提交后,才触发
  789. console.log(obj.total); //得到总文件数
  790. console.log(obj.successful); //请求成功的文件数
  791. console.log(obj.aborted); //请求失败的文件数
  792. }
  793. ,done: function(res, index, upload){ //每个文件提交一次触发一次。详见“请求成功的回调”
  794. }
  795. });
  796. </pre>
  797. </div>
  798. <fieldset class="layui-elem-field layui-field-title site-title">
  799. <legend><a name="progress">文件上传进度的回调</a></legend>
  800. </fieldset>
  801. <div class="site-text">
  802. <p>在网速一般的情况下,大文件的上传通常需要一定时间的等待,而浏览器并不会醒目地告知你它正在努力地上传中,此时为了提升用户体验,我们可以通过该回调制作一个进度条。<span style="color: #FF5722;">注:该回调为 layui 2.5.5 新增</span></p>
  803. <pre class="layui-code">
  804. upload.render({
  805. elem: '#id'
  806. ,url: '/api/upload/'
  807. ,progress: function(n, elem, res, index){
  808. var percent = n + '%' //获取进度百分比
  809. element.progress('demo', percent); //可配合 layui 进度条元素使用
  810. console.log(elem); //得到当前触发的元素 DOM 对象。可通过该元素定义的属性值匹配到对应的进度条。
  811. console.log(res); //得到 progress 响应信息
  812. console.log(index); //得到当前上传文件的索引,多文件上传时的进度条控制,如:
  813. element.progress('demo-'+ index, n + '%'); //进度条
  814. }
  815. });
  816. </pre>
  817. </div>
  818. <fieldset class="layui-elem-field layui-field-title site-title">
  819. <legend><a name="reload">重载实例</a></legend>
  820. </fieldset>
  821. <div class="site-text">
  822. <p>有时你可能需要对 <em>upload.render()</em> 实例进行重载,通过改变一些参数(如将上传文件重置为只上传图片等场景)来重置功能。如:</p>
  823. <pre class="layui-code">
  824. //创建一个实例
  825. var uploadInst = upload.render({
  826. elem: '#id'
  827. ,url: '/api/upload/'
  828. ,size: 1024*5 //限定大小
  829. });
  830. //重载该实例,支持重载全部基础参数
  831. uploadInst.reload({
  832. accept: 'images' //只允许上传图片
  833. ,acceptMime: 'image/*' //只筛选图片
  834. ,size: 1024*2 //限定大小
  835. });
  836. </pre>
  837. <p>注意:<span style="color: #FF5722;">该方法为 layui 2.5.0 开始新增</span></p>
  838. </div>
  839. <fieldset class="layui-elem-field layui-field-title site-title">
  840. <legend><a name="reUpload">重新上传</a></legend>
  841. </fieldset>
  842. <div class="site-text">
  843. <p>在执行 <em>upload.render(options)</em> 方法时,其实有返回一个实例对象,以便对完成重新上传等操作。注意:这是对当前上传队列的全局重新上传,而 <em>choose</em> 回调返回的 <em>obj.upload(index, file)</em> 方法则是对单个文件进行重新上传。如:</p>
  844. <pre class="layui-code">
  845. var uploadInst = upload.render({
  846. elem: '#id'
  847. ,url: '/api/upload/'
  848. ,choose: function(obj){
  849. obj.preview(function(index, file, result){
  850. //对上传失败的单个文件重新上传,一般在某个事件中使用
  851. //obj.upload(index, file);
  852. });
  853. }
  854. });
  855. //重新上传的方法,一般在某个事件中使用
  856. //uploadInst.upload();
  857. </pre>
  858. </div>
  859. <fieldset class="layui-elem-field layui-field-title site-title">
  860. <legend><a name="corsUpload">跨域上传</a></legend>
  861. </fieldset>
  862. <div class="site-text">
  863. <p>有些时候,可能会涉及到文件跨域操作,过去版本的 upload 模块最大的缺陷恰恰在于这里。而从 layui 2.0 的版本开始,我们已经对 跨域做了支持。但鉴于代码的冗余度等多方面考虑,在IE9以下版本环境中,仍然不支持跨域。其它所有版本的IE和Chrome/FireFox等高级浏览器均支持。</p>
  864. <p>那么,需要你怎么做?通常来说,是借助 <em>CORS(跨资源共享)</em> 方案,即对接口所在的服务器设置:<em>Access-Control-Allow-Origin</em> 详见Google,配置起来还是挺简单的。而至于域名限制,一般是服务端程序中去做处理。这里不做过多赘述。</p>
  865. </div>
  866. </div>
  867. </div>
  868. <div class="layui-footer footer footer-doc">
  869. <p>
  870. Copyright &copy; 2021 <a href="../../index.html" tppabs="http://www.layui.com/">「本站仅为 layui 文档保留的镜像站点,与官方无关」</a> MIT Licensed</p>
  871. <p>
  872. <a href="../../about/disclaimer.html" tppabs="http://www.layui.com/about/disclaimer.html" target="_blank">免责声明</a>
  873. <a href="../../about/relatedlinks.html" tppabs="http://www.layui.com/about/relatedlinks.html" target="_blank">友链</a>
  874. <a href="javascript:;" site-event="weixinmp">公众号</a>
  875. </p>
  876. </div>
  877. <script>
  878. window.global = {
  879. pageType: 'doc'
  880. ,preview: function(){
  881. var preview = document.getElementById('LAY_preview');
  882. return preview ? preview.innerHTML : '';
  883. }()
  884. };
  885. </script>
  886. <div class="site-tree-mobile layui-hide">
  887. <i class="layui-icon layui-icon-spread-left"></i>
  888. </div>
  889. <div class="site-mobile-shade"></div>
  890. <script src="/public/layui/dist/layui.js" tppabs="http://res.layui.com/layui/dist/layui.js?t=1632428048260" charset="utf-8"></script>
  891. <script>
  892. layui.config({
  893. base: '/public/static/lay/modules/layui/'
  894. ,version: '1632428048260'
  895. }).use('global');
  896. </script>
  897. <script>
  898. layui.use('upload', function(){
  899. var upload = layui.upload;
  900. //执行示例
  901. var uploadInst = upload.render({
  902. elem: '#test1'
  903. ,url: '/upload/'
  904. ,done: function(res){
  905. //上传完毕回调
  906. }
  907. ,error: function(){
  908. //请求异常回调
  909. }
  910. });
  911. });
  912. </script>
  913. </body>
  914. </html>