upload.htm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <#def title = "文件上传"/>
  2. <#def keyword = "ZhiqimUI"/>
  3. <#def desc = " 知启蒙文件上传提供了多种上传方法,支持表单上传、单文件上传,多文件上传,预览再上传等。"/>
  4. <#def prevUrl = "imageClipper.htm"/>
  5. <#def nextUrl = "uploadLarge.htm"/>
  6. ${zhiqim_com_header()}
  7. ${zhiqim_com_topnav("document")}
  8. <script>
  9. function doChange(tabnav)
  10. {
  11. doUpdateCode(Z(tabnav));
  12. }
  13. function doUpdateCode($this)
  14. {//更新代码
  15. var html = $this.find("section > div").htmlt();
  16. $this.find("section > div").next("div > span").html(html);
  17. }
  18. </script>
  19. <!--容器开始 -->
  20. <div id="container" class="container">
  21. <!--边导航-->
  22. ${zhiqim_com_ui("tutorial", "ui", "tool", "upload")}
  23. <!--主体-->
  24. <div id="mainbody" class="mainbody">
  25. ${zhiqim_com_breadcrumb("文库", "教程", "文件上传")}
  26. <div class="content">
  27. <#-- 标题 -->
  28. <div class="z-relative-left z-w100p z-pd16 z-bg-blue z-px18 z-lh200p z-bold" style="border-left:5px solid #2293e4">
  29. <p class="z-text-blue">文件上传:</p>
  30. <p class="z-color-333" style="text-indent:38px;">
  31. 知启蒙文件上传提供了多种上传方法,支持表单上传、单文件上传,多文件上传,预览再上传等。
  32. </p>
  33. </div>
  34. <#-- 一、最简单文件上传 -->
  35. <div class="tutorial title">一、最简单文件上传</div>
  36. <div class="z-tabnav z-bordered" data-role="z-tabnav" onchange="doChange(this);">
  37. <nav>
  38. <ul class="zi-float-left">
  39. <li class="z-active">示例</li>
  40. <li>代码</li>
  41. <li>说明</li>
  42. </ul>
  43. </nav>
  44. <section style="min-height:150px;">
  45. <div class="z-active z-pd10 z-px16" style="padding-top:40px">
  46. <!-- 初始化上传控件 -->
  47. <script>
  48. Z.onload(function()
  49. {
  50. var upload = new Z.Upload();
  51. upload.contextPath = "${context.getContextPath()}";
  52. upload.elem = "ZUpload";
  53. upload.fileDir = "tutorial";
  54. upload.onCompleted = function(fileUrl){Z("#ZUploadCompleted").html("上传成功,URL:<a href='"+fileUrl+"' target='_blank'>"+fileUrl+"</a>");};
  55. upload.execute();
  56. });
  57. </script>
  58. <!-- 上传文件按钮 -->
  59. <button id="ZUpload" type="button" class="z-button z-blue z-w120">上传文件</button><br><br>
  60. <!-- 上传文件完成信息 -->
  61. <span id="ZUploadCompleted"></span>
  62. </div>
  63. <div class="z-relative-left z-w100p z-pd10">
  64. <span class="z-text-prewrap z-pre"></span>
  65. </div>
  66. <div class="z-pd10 z-px16 z-lh200p">
  67. 1、最简文件上传,是初始化单个文件上传控件<br>
  68. 2、参数只需要指定上传按钮id和上传成功事件onCompleted<br>
  69. 3、在后台配置上下文环境属性upload.rootDir即可
  70. </div>
  71. </section>
  72. </div>
  73. <#-- 二、单文件上传(先预览后上传) -->
  74. <div class="tutorial title">二、单文件上传(先预览后上传)</div>
  75. <div class="z-tabnav z-bordered" data-role="z-tabnav" onchange="doChange(this);">
  76. <nav>
  77. <ul class="zi-float-left">
  78. <li class="z-active">示例</li>
  79. <li>代码</li>
  80. <li>说明</li>
  81. </ul>
  82. </nav>
  83. <section style="min-height:150px;">
  84. <div class="z-active z-pd10 z-px16" style="padding-top:40px">
  85. <!-- 初始化上传控件 -->
  86. <script>
  87. var uploadpreview = null;
  88. Z.onload(function()
  89. {
  90. uploadpreview = new Z.Upload();
  91. uploadpreview.contextPath = "${context.getContextPath()}";
  92. uploadpreview.elem = "ZUploadPreview";
  93. uploadpreview.fileDir = "tutorial";
  94. uploadpreview.onPreview = function(fileUrl){Z("#ZUploadPreviewLocation").html("<img src='"+fileUrl+"' style='max-width:80px;max-height:80px'>")};
  95. uploadpreview.onCompleted = function(fileUrl){Z("#ZUploadPreviewCompleted").html("上传成功,URL:<a href='"+fileUrl+"' target='_blank'>"+fileUrl+"</a>");};
  96. uploadpreview.execute();
  97. });
  98. function doUploadonePreview()
  99. {
  100. uploadpreview.upload();
  101. }
  102. </script>
  103. <!-- 上传文件预览 -->
  104. <div id="ZUploadPreviewLocation" class="z-w100p z-h80"></div>
  105. <!-- 上传文件按钮 -->
  106. <button id="ZUploadPreview" type="button" class="z-button z-blue z-w120">选择文件</button>
  107. <button id="ZUploadUpload" type="button" class="z-button z-w120" onclick="doUploadonePreview();">上传文件</button><br><br>
  108. <!-- 上传文件完成信息 -->
  109. <span id="ZUploadPreviewCompleted"></span>
  110. </div>
  111. <div class="z-relative-left z-w100p z-pd10">
  112. <span class="z-text-prewrap z-pre"></span>
  113. </div>
  114. <div class="z-pd10 z-px16 z-lh200p">
  115. 1、最简文件上传,是初始化单个文件上传控件<br>
  116. 2、参数只需要指定上传按钮id和上传成功事件onCompleted<br>
  117. 3、在后台配置上下文环境属性upload.rootDir<br>
  118. 4、如果需要分成两步,先预览后上传,则增加预览处理
  119. </div>
  120. </section>
  121. </div>
  122. <#-- 三、多文件上传(先预览后上传,默认图片) -->
  123. <div class="tutorial title">三、多文件上传(先预览后上传,默认图片)</div>
  124. <div class="z-tabnav z-bordered" data-role="z-tabnav" onchange="doChange(this);">
  125. <nav>
  126. <ul class="zi-float-left">
  127. <li class="z-active">示例</li>
  128. <li>代码</li>
  129. <li>说明</li>
  130. </ul>
  131. </nav>
  132. <section style="min-height:200px;">
  133. <div class="z-active z-pd10 z-px16" style="padding-top:40px">
  134. <!-- 初始化上传控件 -->
  135. <script>
  136. var uploadmultpreview = null;
  137. Z.onload(function()
  138. {
  139. uploadmultpreview = new Z.Uploadmult();
  140. uploadmultpreview.elem = "ZUploadmultPreview";
  141. uploadmultpreview.fileDir = "tutorial";
  142. uploadmultpreview.onPreview = function(results)
  143. {
  144. uploadmultpreview.buildPreviewHtml("ZUploadmultPreviewLocation");
  145. };
  146. uploadmultpreview.onCompleted = function(results)
  147. {
  148. var html = "";
  149. for (var i=0;i<results.length;i++){
  150. if (i != 0)
  151. html += "<br>";
  152. if (results[i].success)
  153. html += "上传成功,URL:<a href='"+results[i].success+"' target='_blank'>"+results[i].success+"</a>";
  154. else
  155. html += "上传失败,原因:"+results[i].error;
  156. }
  157. Z("#ZUploadmultPreviewCompleted").html(html);
  158. };
  159. uploadmultpreview.execute();
  160. });
  161. function doUploadmultPreview()
  162. {
  163. uploadmultpreview.upload();
  164. }
  165. </script>
  166. <!-- 上传文件预览 -->
  167. <div id="ZUploadmultPreviewLocation" class="z-w100p z-h80"></div>
  168. <!-- 上传文件按钮 -->
  169. <div class="z-relative-left z-w100p">
  170. <button id="ZUploadmultPreview" class="z-button z-blue z-w120">选择文件</button>
  171. <button id="ZUploadmultUpload" class="z-button z-w120" onclick="doUploadmultPreview();">上传文件</button>
  172. </div>
  173. <!-- 上传文件完成信息 -->
  174. <div id="ZUploadmultPreviewCompleted" class="z-relative-left z-w100p z-mg10 z-lh150p"></div>
  175. </div>
  176. <div class="z-relative-left z-w100p z-pd10">
  177. <span class="z-text-prewrap z-pre"></span>
  178. </div>
  179. <div class="z-pd10 z-px16 z-lh200p">
  180. 1、最简文件上传,是初始化多个文件上传控件<br>
  181. 2、参数只需要指定上传按钮id和上传成功事件onCompleted<br>
  182. 3、在后台配置上下文环境属性upload.rootDir<br>
  183. 4、如果需要分成两步,先预览后上传,则增加预览处理
  184. </div>
  185. </section>
  186. </div>
  187. <#-- 四、表单文件上传,可以含参数 -->
  188. <div class="tutorial title">四、表单文件上传,可以含参数</div>
  189. <div class="z-tabnav z-bordered" data-role="z-tabnav" onchange="doChange(this);">
  190. <nav>
  191. <ul class="zi-float-left">
  192. <li class="z-active">示例</li>
  193. <li>代码</li>
  194. <li>说明</li>
  195. </ul>
  196. </nav>
  197. <section style="min-height:150px;">
  198. <div class="z-active z-pd10 z-px16 z-lh300p" style="padding-top:40px;">
  199. <!-- 表单文件上传 -->
  200. ${Htmls.toCallFrame()}
  201. <form action="uploadForm.htm" method="post" enctype="multipart/form-data" data-role="z-call-frame">
  202. 参数1:<input name="p1" class="z-input"><br>
  203. 参数2:<input name="p2" class="z-input"><br>
  204. <button type="button" class="z-button z-blue z-w120" onclick="Z(this).next('input')[0].value=null;Z(this).next('input')[0].click();">选择文件</button>
  205. <input class="z-hide" type="file" name="file" accept="*.*" onchange="Z(this).next('span').text(this.value);" single>
  206. <span></span>
  207. <button type="submit" class="z-button">上传</button>
  208. </form>
  209. </div>
  210. <div class="z-relative-left z-w100p z-pd10">
  211. <span class="z-text-prewrap z-pre"></span>
  212. </div>
  213. <div class="z-pd10 z-px16 z-lh200p">
  214. 1、表单文件上传的特点是支持参数一起传递,采用multipart/form-data格式<br>
  215. 2、把真实的文件上传按钮隐藏起来(各浏览器表现不一样,太不美观),使用一个button代替<br>
  216. 3、提供一个span用户显示文件选择的路径,这里也可以设计成预览<br>
  217. 4、上传button,和提供一个Action处理数据。如下:
  218. <span class="z-text-prewrap z-pre">
  219. public class UploadFormAction implements Action, HttpdConstants
  220. {
  221. private static final Log log = LogFactory.getLog(UploadFormAction.class);
  222. @Override
  223. public void execute(HttpRequest request) throws Exception
  224. {
  225. String rootDir = request.getContextAttributeString(_SERV_UPLOAD_ROOT_DIR_);
  226. if (Validates.isEmptyBlank(rootDir) || !Files.mkDirectory(rootDir))
  227. {
  228. request.setAlertMsg("未配置上传目录,不支持上传");
  229. return;
  230. }
  231. HttpUploader uploader = new HttpUploader();
  232. try
  233. {//最大支持2M
  234. uploader.parseHttpRequest(request, 2*1024*1024);
  235. String fileExt = uploader.getFileExt();
  236. if(Validates.isEmpty(fileExt) || !Validates.isContain("jpg,png,gif", ",", fileExt))
  237. {
  238. request.setAlertMsg("仅支持图片,请重新上传");
  239. return;
  240. }
  241. //文件字节比较
  242. byte[] content = uploader.getBytes();
  243. if (!(Bytes.isGIZ(content) || Bytes.isPNG(content) || Bytes.isJPG(content)))
  244. {
  245. request.setAlertMsg("图片格式不正确,请重新上传");
  246. return;
  247. }
  248. //读出参数
  249. String param1 = uploader.getParameter("p1");
  250. String param2 = uploader.getParameter("p2");
  251. log.info("参数1:"+param1+",参数2:"+param2);
  252. //保存文件
  253. String fileDir = Strings.addEndsWith(Files.toLinuxPath(rootDir), "/");
  254. String fileName = Ids.longId() + "." + fileExt;
  255. uploader.writeToFile(fileDir + fileName);
  256. request.setAlertMsg("上传成功");
  257. }
  258. catch(Exception e)
  259. {
  260. request.setAlertMsg("上传失败");
  261. }
  262. finally
  263. {
  264. uploader.close();
  265. }
  266. }
  267. }
  268. </span>
  269. </div>
  270. </section>
  271. </div>
  272. ${zhiqim_com_chapter()}
  273. </div>
  274. <!-- 主体结束 -->
  275. </div>
  276. <!-- 容器结束 -->
  277. </div>
  278. ${zhiqim_com_footer()}