SpringMVC之文件上传(进度条显示)

1、实现org.apache.commons.fileupload.ProgressListener接口

 
 
  1. import javax.servlet.http.HttpSession;
  2. import org.apache.commons.fileupload.ProgressListener;
  3. import org.springframework.stereotype.Component;
  4. import com.chinalife.cip.web.multipart.model.Progress;
  5. @Component
  6. public class FileUploadProgressListener implements ProgressListener {
  7. private HttpSession session;
  8. public void setSession(HttpSession session){
  9. this.session=session;
  10. Progress status = new Progress();
  11. session.setAttribute("status", status);
  12. }
  13. /*
  14. * pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件
  15. */
  16. public void update(long pBytesRead, long pContentLength, int pItems) {
  17. Progress status = (Progress) session.getAttribute("status");
  18. status.setpBytesRead(pBytesRead);
  19. status.setpContentLength(pContentLength);
  20. status.setpItems(pItems);
  21. }
  22. }


 

2、扩展org.springframework.web.multipart.commons.CommonsMultipartResolver类

      重写public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException方法


 
 
  1. import java.util.List;
  2. import javax.servlet.http.HttpServletRequest;
  3. import org.apache.commons.fileupload.FileItem;
  4. import org.apache.commons.fileupload.FileUpload;
  5. import org.apache.commons.fileupload.FileUploadBase;
  6. import org.apache.commons.fileupload.FileUploadException;
  7. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.web.multipart.MaxUploadSizeExceededException;
  10. import org.springframework.web.multipart.MultipartException;
  11. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  12. import com.chinalife.cip.web.multipart.listener.FileUploadProgressListener;
  13. public class CustomMultipartResolver extends CommonsMultipartResolver {
  14. @Autowired
  15. private FileUploadProgressListener progressListener;
  16. public void setFileUploadProgressListener(FileUploadProgressListener progressListener){
  17. this.progressListener=progressListener;
  18. }
  19. @Override
  20. @SuppressWarnings("unchecked")
  21. public MultipartParsingResult parseRequest(HttpServletRequest request)
  22. throws MultipartException {
  23. String encoding = determineEncoding(request);
  24. FileUpload fileUpload = prepareFileUpload(encoding);
  25. progressListener.setSession(request.getSession());
  26. fileUpload.setProgressListener(progressListener);
  27. try {
  28. List <FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
  29. return parseFileItems(fileItems, encoding);
  30. }
  31. catch (FileUploadBase.SizeLimitExceededException ex) {
  32. throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
  33. }
  34. catch (FileUploadException ex) {
  35. throw new MultipartException("Could not parse multipart servlet request", ex);
  36. }
  37. }
  38. }


 

3、mvc命名空间声明

 
 
  1. <bean id="multipartResolver" class="com.chinalife.cip.web.multipart.CustomMultipartResolver">
  2. <property name="maxUploadSize" value="50000000" />
  3. </bean>

4、获取文件controller编写

 
 
  1. @RequestMapping(...)
  2. public String uploadFile(@RequestParam(value = "file") MultipartFile... files) throws IOException {
  3. for (MultipartFile f : files) {
  4. if (f.getSize() > 0) {
  5. File targetFile = new File("目标文件路径及文件名");
  6. f.transferTo(targetFile);//写入目标文件
  7. }
  8. }
  9. return "...";
  10. }

5、文件进度controller编写

 
 
  1. import java.util.Map;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. import org.springframework.web.bind.annotation.SessionAttributes;
  7. import com.chinalife.cip.web.multipart.model.Progress;
  8. @Controller
  9. @SessionAttributes("status")
  10. public class ProgressController {
  11. @RequestMapping(value = "/upfile/progress", method = RequestMethod.POST )
  12. @ResponseBody
  13. public String initCreateInfo(Map <String, Object> model) {
  14. Progress status = (Progress) model.get("status");
  15. if(status==null){
  16. return "{}";
  17. }
  18. return status.toString();
  19. }
  20. }

6、最后

       html及js脚本就不在此赘述了,网上有很多例子,给出一个示例。


 
 
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
  4. <c:set var="ctx" value="${pageContext.request.contextPath}" />
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  9. <title>文件上传 </title>
  10. <script type="text/javascript" src="${ctx}/js/jquery-2.1.4/jquery-2.1.4.js"> </script>
  11. <script type="text/javascript" src="${ctx}/js/bootstrap-3.3.5/js/bootstrap.min.js"> </script>
  12. <link rel="stylesheet" href="${ctx}/js/bootstrap-3.3.5/css/bootstrap.min.css" />
  13. <style type="text/css">
  14. .file-box {
  15. position: relative;
  16. width: 340px
  17. }
  18. .txt {
  19. height: 22px;
  20. border: 1px solid #cdcdcd;
  21. width: 180px;
  22. vertical-align: middle;
  23. margin: 0;
  24. padding: 0
  25. }
  26. .btn {
  27. border: 1px solid #CDCDCD;
  28. height: 24px;
  29. width: 70px;
  30. vertical-align: middle;
  31. margin: 0;
  32. padding: 0
  33. }
  34. .file {
  35. position: absolute;
  36. top: 0;
  37. right: 80px;
  38. height: 24px;
  39. filter: alpha(opacity : 0);
  40. opacity: 0;
  41. width: 260px;
  42. vertical-align: middle;
  43. margin: 0;
  44. padding: 0
  45. }
  46. </style>
  47. <script type="text/javascript">
  48. <%--
  49. function myInterval()
  50. {
  51. $( "#progress").html( "");
  52. $.ajax({
  53. type: "POST",
  54. url: "<%=basePath%>UserControllers/getSessions",
  55. data : "1=1",
  56. dataType : "text",
  57. success : function(msg) {
  58. var data = msg;
  59. console.log(data);
  60. $( "#pdiv").css( "width", data + "%");
  61. $( "#progress").html(data + "%");
  62. }
  63. });
  64. }
  65. function autTime() {
  66. setInterval( "myInterval()", 200); //1000为1秒钟
  67. }
  68. --%>
  69. function UpladFile() {
  70. var fileObj = document.getElementById( "file").files[ 0]; // js 获取文件对象
  71. var FileController = "${ctx}/upload/progress"; // 接收上传文件的后台地址
  72. // FormData 对象
  73. var form = new FormData();
  74. form.append( "author", "hooyes"); // 可以增加表单数据
  75. form.append( "file", fileObj); // 文件对象
  76. // XMLHttpRequest 对象
  77. var xhr = new XMLHttpRequest();
  78. xhr.open( "post", FileController, true);
  79. xhr.onload = function() {
  80. alert( "上传完成!");
  81. //$('#myModal').modal('hide');
  82. };
  83. xhr.upload.addEventListener( "progress", progressFunction, false);
  84. xhr.send(form);
  85. }
  86. function progressFunction(evt) {
  87. var progressBar = document.getElementById( "progressBar");
  88. var percentageDiv = document.getElementById( "percentage");
  89. if (evt.lengthComputable) {
  90. progressBar.max = evt.total;
  91. progressBar.value = evt.loaded;
  92. percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100)+ "%";
  93. }
  94. }
  95. </script>
  96. </head>
  97. <body style="width: 80%;height: 80%;margin: 0px auto;">
  98. <div class="row bootstrap-admin-no-edges-padding">
  99. <div class="col-md-12">
  100. <div class="panel panel-default">
  101. <div class="panel-heading">
  102. <div class="text-muted bootstrap-admin-box-title">文件管理 </div>
  103. </div>
  104. <div class="bootstrap-admin-panel-content">
  105. <button class="btn btn-primary btn-lg" data-toggle="modal"
  106. data-target= "#myModal">上传 </button>
  107. <input type="text" id="test">
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <!-- 模态框(Modal) -->
  113. <div class="modal fade" id="myModal" tabindex="-1" role="dialog"
  114. aria-labelledby= "myModalLabel" aria-hidden= "true">
  115. <div class="modal-dialog">
  116. <div class="modal-content">
  117. <div class="modal-header">
  118. <button type="button" class="close" data-dismiss="modal"
  119. aria-hidden= "true"</button>
  120. <h4 class="modal-title" id="myModalLabel">文件上传进度 </h4>
  121. </div>
  122. <div class="modal-body">
  123. <progress id="progressBar" value="0" max="100"
  124. style= "width: 100%;height: 20px; "> </progress>
  125. <span id="percentage" style="color:blue;"> </span> <br>
  126. <br>
  127. <div class="file-box">
  128. <input type='text' name='textfield' id='textfield' class='txt' />
  129. <input type='button' class='btn' value='浏览...' /> <input
  130. type= "file" name= "file" class= "file" id= "file" size= "28"
  131. onchange= "document.getElementById('textfield').value=this.value" />
  132. <input type="submit" name="submit" class="btn" value="上传"
  133. onclick= "UpladFile()" />
  134. </div>
  135. </div>
  136. <div class="modal-footer">
  137. <button type="button" class="btn btn-default" data-dismiss="modal">关闭
  138. </button>
  139. </div>
  140. </div>
  141. <!-- /.modal-content -->
  142. </div>
  143. <!-- /.modal -->
  144. </div>
  145. </body>
  146. </html>


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值