转载自:http://blog.csdn.net/sunjing21/article/details/4779321

实现主要功能:

  • 页面提供一个上传图片的input file选择框,用于上传某一类型的数张图片
  • 每次选择完本地图片后,图片便异步存储到后台的文件夹中;
  • 并将路径信息存储到数据库中;
  • 页面上显示此图的缩略图,并在旁边显示一个删除标记,当点击时,将此图片从页面、数据库、后台的文件夹中删除
  • input file选择框清空,再点击用于上传下一张图片;

JSP页面编写如下:

  1. <div>
  2. <form action="uploadWaiguanImage.do" id="waiguan_form" name="waiguan_form"
  3. enctype="multipart/form-data" method="post" target="waiguan_hidden_frame">
  4. <span>
  5. <label>外观图</label>
  6. <img src="data:images/addImage.JPG">
  7. <input type="file" id="waiguan_add" name="waiguan_add"/>
  8. </span>
  9. <iframe name="waiguan_hidden_frame" id="waiguan_hidden_frame" style="display:none"></iframe>
  10. <c:forEach var="x" begin="1" end="3" step="1">
  11. <span>
  12. <img id="waiguan_image${x }" style="visibility:hidden" src="" width="100" alt="外观图${x }"/>
  13. <img id="waiguan_delete_image${x }" style="visibility:hidden;cursor: pointer" src="data:images/deleteImage.JPG"/>
  14. </span>
  15. </c:forEach>
  16. </form>
  17. </div>

让form的target值为iframe,当form提交的时候,是异步iframe进行提交,不会影响页面的其他部分。 
c:forEach部分是首先隐藏了上传后显示的图片标签和删除标签(这里最大可以上传三张)

相应的JS代码:采用的是JQuery写的,不过写的很啰嗦,有点像是原始JS操作

  1. /**
  2. * 页面加载时完成操作
  3. */
  4. $(document).ready(function() {
  5. // 设置上传外观图
  6. $("#waiguan_add").bind("change", function() {
  7. submitImage("waiguan", 3);
  8. });
  9. }
  10.  
  11. /**
  12. * 上传图片
  13. *
  14. * @param {}
  15. * para_name 图片所属属性名
  16. * @param {}
  17. * number 此类图片的总数量
  18. */
  19. function submitImage(para_name, number) {
  20. var para_form = para_name + "_form";
  21. var para_image = para_name + "_image";
  22.  
  23. // alert(para_image);
  24.  
  25. for (var i = 1; i <= number; i++) {
  26. var srcValue = $("#" + para_image + i).attr("src");
  27. // alert(srcValue);
  28. // alert(srcValue.length);
  29. if (srcValue == "" || srcValue.length == 0) {
  30. // alert("break");
  31. break;
  32. }
  33. }
  34.  
  35. if (i > number) {
  36. alert("已超过了此类图的上传最大限");
  37. // 重置上传按钮,使之为空
  38. resetUploadBotton(para_name + "_add");
  39. } else {
  40.  
  41. $("#" + para_form).submit();
  42. }
  43. }
  44.  
  45. /**
  46. * iframe上传外观图片的返回操作
  47. *
  48. * @param {}
  49. * msg 返回的图片所在地址
  50. */
  51. function callbackWaiguan(msg) {
  52.  
  53. if (msg != "error") {
  54. for (var i = 1; i <= 3; i++) {
  55. var srcValue = $("#waiguan_image" + i).attr("src");
  56. // alert(srcValue);
  57. if (srcValue == "" || srcValue.length == 0) {
  58. $("#waiguan_image" + i).attr("src", msg);
  59. $("#waiguan_image" + i).css("visibility", "visible");
  60. $("#waiguan_delete_image" + i).css("visibility", "visible");
  61. $("#waiguan_delete_image" + i).click(function() {
  62.  
  63. deleteImage("waiguan", i);
  64.  
  65. });
  66. break;
  67. }
  68. }
  69. } else {
  70. alert("上传图片失败,后台程序出现问题!");
  71. }
  72.  
  73. // 重置上传按钮,使之为空
  74. resetUploadBotton("waiguan_add");
  75. }
  76.  
  77. /**
  78. * 删除某个图片时的异步操作
  79. *
  80. * @param {}
  81. * para_name
  82. * @param {}
  83. * number
  84. */
  85. function deleteImage(para_name, number) {
  86. var delete_image_id = para_name + "_image" + number;
  87. var imagePathName = $("#" + delete_image_id).attr("src");
  88.  
  89. if (para_name == "waiguan") {
  90.  
  91. $.get("deleteWaiguanImage.do", {
  92. deleteFile : imagePathName,
  93. t : Math.random()
  94. }, function(tag) {
  95.  
  96. alert(tag);
  97. if (tag == "true") {
  98. $("#" + delete_image_id).attr("src", "");
  99. $("#" + delete_image_id).css("visibility", "hidden");
  100. $("#" + para_name + "_delete_image" + number).css("visibility",
  101. "hidden");
  102. } else {
  103. alert("连接数据库失败,无法删除该图片!");
  104. }
  105. });
  106. }
  107. }
  108.  
  109. /**
  110. * 重置上传按钮,使之为空
  111. *
  112. * @param {}
  113. * para_name_add
  114. */
  115. function resetUploadBotton(para_name_add) {
  116. var form = document.createElement("form");
  117. var span = document.createElement("span");
  118. var para_image_file = document.getElementById(para_name_add);
  119. para_image_file.parentNode.insertBefore(span, para_image_file);
  120. form.appendChild(para_image_file);
  121. form.reset();
  122. span.parentNode.insertBefore(para_image_file, span);
  123. span.parentNode.removeChild(span);
  124. form.parentNode.removeChild(form);
  125.  
  126. }

上传图片采用的是定义的form的submit()提交,iframe的异步提交。 
返回操作将image的src的值,置为刚upload的图片在webroot中的位置,这样就能显示图片了。 
删除图片时,利用Ajax将要删除的图片路径发送到后台,进行删除,删除成功时,将页面html中image的src值置为空。

后台处理的方法如下:

  1. /**
  2. * 初始化SmartUpload类,用于上传文件
  3. *
  4. * @param servlet
  5. * @return SmartUpload
  6. * @throws ServletException
  7. * @throws IOException
  8. * @throws SQLException
  9. */
  10. public SmartUpload initSmartUpload(ActionServlet servlet)
  11. throws ServletException, IOException, SQLException {
  12. // 新建一个SmartUpload对象
  13. SmartUpload su = new SmartUpload();
  14.  
  15. javax.servlet.jsp.PageContext pageContext = JspFactory
  16. .getDefaultFactory().getPageContext(servlet, request, response,
  17. null, true, 8192, true);
  18. // 上传初始化
  19. su.initialize(pageContext);
  20.  
  21. // 设定上传限制
  22. // 1.限制每个上传文件的最大长度。
  23. su.setMaxFileSize(10000000);
  24.  
  25. // 2.限制总上传数据的长度。
  26. su.setTotalMaxFileSize(20000000);
  27.  
  28. // 3.设定允许上传的文件
  29. su.setAllowedFilesList("jpg,gif,bmp,pcx,"
  30. + "tiff,jpeg,tga,exif,fpx,cad");
  31.  
  32. // 4.设定禁止上传的文件
  33. su.setDeniedFilesList("exe,bat,jsp,htm,html");
  34.  
  35. return su;
  36. }
  37.  
  38. /**
  39. * 异步上传外观图
  40. *
  41. * @param mapping
  42. * @param form
  43. * @param request
  44. * @param response
  45. * @return
  46. * @throws Exception
  47. */
  48. public ActionForward uploadWaiguanImage(ActionMapping mapping,
  49. ActionForm form, HttpServletRequest request,
  50. HttpServletResponse response) throws Exception {
  51.  
  52. SeriesService seriesService = ServiceFactory.getSeriesService(request,
  53. response);
  54.  
  55. String filePathName = null;
  56.  
  57. boolean tag= true;
  58. try {
  59. //初始化SmartUpload对象
  60. SmartUpload su = seriesService.initSmartUpload(this.getServlet());
  61. //上传外观图,将文件存储在filePath中,遍历系列对象的外观图属性,将图片的位置存储在某一空的属性中
  62. filePathName = "upload/" + seriesService.addWaiguanImage(su);
  63.  
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. tag = false;
  67. }
  68.  
  69. PrintWriter out = response.getWriter();
  70. if (tag == true) {
  71. out.println("<script>parent.callbackWaiguan('" + filePathName
  72. + "')</script>");
  73. } else {
  74. out.println("<script>parent.callbackWaiguan('error')</script>");
  75. }
  76.  
  77. return null;
  78. }
  79.  
  80. /**
  81. * 异步删除某个外观图
  82. *
  83. * @param mapping
  84. * @param form
  85. * @param request
  86. * @param response
  87. * @return
  88. * @throws Exception
  89. */
  90. public ActionForward deleteWaiguanImage(ActionMapping mapping,
  91. ActionForm form, HttpServletRequest request,
  92. HttpServletResponse response) throws Exception {
  93. Integer seriesID = (Integer) request.getSession().getAttribute(
  94. "seriesID");
  95. String filePathName = (String) request.getParameter("deleteFile");
  96.  
  97. SeriesService seriesService = ServiceFactory.getSeriesService(request,
  98. response);
  99. boolean tag = true;
  100. try {
  101. //从数据库中和文件路径中删除外观图
  102. tag = seriesService.deleteWaiguanImage(filePathName, seriesID);
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. tag = false;
  106. }
  107.  
  108. PrintWriter out = response.getWriter();
  109.  
  110. out.write(new Boolean(tag).toString());
  111.  
  112. return null;
  113. }

这样,便完成了要实现的功能。

form、iframe实现异步上传文件的更多相关文章

  1. 利用jquery.form实现异步上传文件

    实现原理 目前需要在一个页面实现多个地方调用上传控件上传文件,并且必须是异步上传.思考半天,想到通过创建动态表单包裹上传文件域,利用jquery.form实现异步提交表单,从而达到异步上传的目的,在上 ...

  2. Asp.Net Mvc异步上传文件的方式

    今天试了下mvc自带的ajax,发现上传文件时后端action接收不到文件, Request.Files和HttpPostedFileBase都接收不到.....后来搜索了下才知道mvc自带的Ajax ...

  3. jquery ajaxFileUpload异步上传文件

    ajaxFileUpload.js 很多同名的,因为做出来一个很容易. 我用的是这个:https://github.com/carlcarl/AjaxFileUpload 下载地址在这里:http:/ ...

  4. Jquery异步上传文件

    我想通过jQuery异步上传文件,这是我的HTML: 1 2 3 <span>File</span> <input type="file" id=&q ...

  5. Servlet异步上传文件

    这里需要用到插件ajaxfileupload.js,jar包:commons-fileupload-1.3.2.jar,commons-io-2.5.jar 注意红色部分的字!!!! 1.创建一个we ...

  6. struts2 jquery ajaxFileUpload 异步上传文件

    网上搜集的,整理一下. 一.ajaxFileUpload 实现异步上传文件利用到了ajaxFileUpload.js这个文件,这是别人开发的一个jquery的插件,可以实现文件的上传并能够和strut ...

  7. 关于js异步上传文件

    好久没登录博客园了,今天来一发分享. 最近项目里有个需求,上传文件(好吧,这种需求很常见,这也不是第一次遇到了).当时第一想法就是直接用form表单提交(原谅我以前就是这么干的),不过表单里不仅有文件 ...

  8. 【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)

    前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现a ...

  9. 异步上传文件,ajax上传文件,jQuery插件之ajaxFileUpload

    http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 一.ajaxFileUpload是一个异步上传文件的jQuery插件. ...

随机推荐

  1. nyoj 364 田忌赛马(贪心)

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Here is a famous story in Chinese history. "That ...

  2. Ubuntu 12 安装 MySQL 5.6.26 及 问题汇总

    参考先前的文章:Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记 安装过程: #安装依赖库 sudo apt-get install ...

  3. iOS8无法弹出本地通知?

    最近在看<iOS编程(第4版)>(就是Big Nerd Ranch用的那本教材).这本书写的不错,推荐一下,写的很细致,循序渐进,不能不赞一下外国人写书的思路,确实跟国人不同.之前学And ...

  4. PHPStorm Xdebug配置

    下载PHSTORM https://download.jetbrains.com/webide/PhpStorm-2016.1.2.exe http://idea.lanyus.com/查找授权服务器 ...

  5. Javascript高级程序设计——客户端检测

    ECMAScript虽然是Javascript的核心,但是要在web中使用Javascript,那么BOM才是核心,BOM为我们提供了操作访问浏览器对象的借口, 但是由于BOM没有标准规范,导致存在不 ...

  6. 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列

    此文是根据赵磊在[QCON高可用架构群]中的分享内容整理而成.转载请事先联系赵磊及相关编辑. 赵磊,Uber高级工程师,08年上海交通大学毕业,曾就职于微软,后加入Facebook主要负责Messen ...

  7. php删除字符串中的所有空格

    function trimall($str)//删除空格 { $qian=array(" "," ","\t","\n" ...

  8. log4j 配置

    给java项目添加log4j日志: 1.下载log4j jar包,放入lib目录, 导入项目中 2.创建log4j.properties 文件  目录 Src 3.在需要使用输出的类中使用 priva ...

  9. PHP中函数sprintf .vsprintf (占位符)

    sprintf()格式化字符串写入一个变量中. vsprintf()格式化字符串些写入变量中. <?php $num1 = 123; $num2 = 456; $txt = vsprintf(& ...

  10. BZOJ 3270: 博物馆

    Sol 期望DP+高斯消元. 根据本题题意列出期望方程\[E(i,j)=(1-p_i)(1-p_j)E(u,v)+(1-p_i)p_jE(u,j)+p_i(1-p_j)E(i,v)+p_ip_jE(i ...