本文将使用   apache fileupload   ,spring MVC   jquery 实现一个带进度条的多文件上传, 由于fileupload 的局限,暂不能实现每个上传文件都显示进度条,只能实现一个总的进度条

优点:不用引入第三方的组件(如js框架,flash等)

缺点:如果同时上传多个文件,由于apache fileupload API的限制,只能显示一个总的进度条

1.引入环境所需要的jar包

引入上传工具类jar包

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

引入mvc处理json数据jar包(@requestbody&@responsebody)

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>

2.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
<script type="text/javascript">
$(document).ready(function(){
$('#subbut').bind('click',
function(){
$('#fForm').submit(); var eventFun = function(){
$.ajax({
type: 'GET',
url: '${pageContext.request.contextPath}/test/process.action',
data: {},
dataType: 'json',
success : function(data){
$("#fff").html("上传进度:"+data.show);
$( "#proBar" ).progressbar({
value: data.rate
});
if(data.rate == 100){
window.clearInterval(intId);
alert("上传完成");
}
}});};
var intId = window.setInterval(eventFun,100);
});
});
</script>
<title>Insert title here</title>
</head>
<body>
<form id='fForm' action="${pageContext.request.contextPath}/test/testbar.action" encType="multipart/form-data" method="post" target="uploadf">
<div>
<label>上传文件:</label>
<div>
<input type="file" name="file" style="width:550">
</div> <label id="fff"></label>
<div>
<div style="width:50%">
<div id = 'proBar'></div>
</div>
</div>
</div>
<div >
<div >
<button type="button" id="subbut" >submit</button>
</div>
</div>
</form>
<iframe name="uploadf" style="display:none"></iframe>
</body>
</html>

这里注意需要引入js和css,如果需要更换进度条的样式,可以引入其他的css(如bootstarp等)

3.后台的实现

import java.io.File;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/test")
public class FileUploadController { private final Logger log = Logger.getLogger(FileUploadController.class); /**
* upload 上传文件
*/
@RequestMapping(value = "/testbar.action", method = RequestMethod.POST)
public ModelAndView upload(HttpServletRequest request,HttpServletResponse response) throws Exception {
final HttpSession hs = request.getSession();
ModelAndView mv = new ModelAndView();
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart){
return mv;
}
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8"); upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int pItems) {
ProcessInfo pri = new ProcessInfo();
pri.itemNum = pItems;
pri.readSize = pBytesRead;
pri.totalSize = pContentLength;
pri.show = pBytesRead+"/"+pContentLength+" byte";
pri.rate = Math.round(new Float(pBytesRead) / new Float(pContentLength)*100);
hs.setAttribute("proInfo", pri);
}
});
// Parse the request
List items = upload.parseRequest(request);
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("utf-8");
System.out.println("this is common feild!"+name+"="+value);
} else {
System.out.println("this is file feild!");
String fieldName = item.getFieldName();
String fileName = item.getName().substring(item.getName().lastIndexOf("\\")+1);;
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
File uploadedFile = new File("c://"+fileName);
item.write(uploadedFile); }
} return mv;
} /**
* process 获取进度
*/
@RequestMapping(value = "/process.action", method = RequestMethod.GET)
public @ResponseBody Object process(HttpServletRequest request,HttpServletResponse response) throws Exception {
return ( ProcessInfo)request.getSession().getAttribute("proInfo");
}
//精度条pojo
class ProcessInfo{
public long totalSize = 1;
public long readSize = 0;
public String show = "";
public int itemNum = 0;
public int rate = 0;
}
}

aaarticlea/png;base64,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" alt="" />

4.SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

问题产生的原因

先看一下springmvc中上传的配置

  <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="2000000000" />
</bean>

再看看controller中使用

方式一

 public void upload2(HttpServletRequest request) {
// 转型为MultipartHttpRequest
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> fileList = multipartRequest.getFiles("file");
for (MultipartFile mf : fileList) {
if(!mf.isEmpty()){ }
}
} catch (Exception e) {
e.printStackTrace();
} }

方式二

 public String upload(HttpServletRequest request,
@RequestParam(value = "file") MultipartFile[] files) {
try {
for (MultipartFile mf : files) {
if(!mf.isEmpty()){ }
} } catch (Exception e) {
e.printStackTrace();
}
return "upload";
}

这里springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResolver这个转换器里面.他的转换器里面就是调用common-fileupload的方式解析,然后再使用parseFileItems()方法封装成自己的文件对象.大家应该发现了上面的这句代码,已经使用过fileUpload解析过request了,你在Controller里面接收到的request都已经是解析过的,你再次使用upload进行解析获取到的肯定是空,这个就是问题的所在

解决方式一(以上案例就是用此解决方法)

1.删除mvc里面上传的配置

<!--         <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> -->
<!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<!-- <property name="maxUploadSize" value="200000"/> -->
<!-- </bean> -->

2.在控制器里面自己完成request的解析(当然上面spring MVC提供的两种方法是不能用的,所有上传的地方都需要自己做处理)

public void upload3(HttpServletRequest request) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> list = upload.parseRequest(request);
for(FileItem item : list){
if(item.isFormField()){ }else{
//item.write(new File(""));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} }

解决方式二(重写listener)

1.创建状态pojo

public class Progress {

     public long totalSize = 1;
public long readSize = 0;
public String show = "";
public int itemNum = 0;
public int rate = 0; public void setTotalSize(long totalSize) {
this.totalSize = totalSize;
} public void setReadSize(long readSize) {
this.readSize = readSize;
}
public String getShow() {
return readSize+"/"+totalSize+" byte";
} public int getItemNum() {
return itemNum;
}
public void setItemNum(int itemNum) {
this.itemNum = itemNum;
}
public int getRate() {
return Math.round(new Float(readSize) / new Float(totalSize)*100);
}
}

2.写自己的listener

import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;

public class FileUploadListener implements ProgressListener{

        private HttpSession session;  

        public void setSession(HttpSession session){
this.session=session;
Progress status = new Progress();
session.setAttribute("status", status);
} /*
* pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
Progress status = (Progress) session.getAttribute("status");
status.setReadSize(pBytesRead);
status.setTotalSize(pContentLength);
status.setItemNum(pItems);
} }

3.写自己的resolver

public class CommonsMultipartResolverExt extends CommonsMultipartResolver{

     @Override
protected MultipartParsingResult parseRequest(HttpServletRequest request)
throws MultipartException {
FileUploadListener listener = new FileUploadListener();
listener.setSession(request.getSession());
String encoding = determineEncoding(request);
FileUpload fileUpload = prepareFileUpload(encoding);
fileUpload.setProgressListener(listener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
}
catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
}
catch (FileUploadException ex) {
throw new MultipartException("Could not parse multipart servlet request", ex);
}
}
}

4.配置上传resolver

    <bean id="multipartResolver" class="com.fyh.www.common.CommonsMultipartResolverExt"></bean>

5.测试

@Controller
@RequestMapping("/test2")
public class FileUploadController2 { private final Logger log = Logger.getLogger(FileUploadController2.class); /**
* upload 上传文件
*/
@RequestMapping(value = "/testbar.action", method = RequestMethod.POST)
public ModelAndView upload(HttpServletRequest request,HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("file"); InputStream inputStream = file.getInputStream(); FileUtils.copyInputStreamToFile(inputStream, new File("e://"+file.getOriginalFilename())); return mv;
} /**
* process 获取进度
*/
@RequestMapping(value = "/process.action", method = RequestMethod.GET)
public @ResponseBody Object process(HttpServletRequest request,HttpServletResponse response) throws Exception {
return ( Progress)request.getSession().getAttribute("status");
} }

此方案在获取监控进度的同时并不因影响mvc原有上传方法的使用

解决方式三(需要用到进度条的上传时,写独立的servlet,servlet+apache uploadfile  与springmvc互不干预)不建议用此方法

最新文章

  1. java基础高级2 MySQL 高级
  2. SQL多表连接查询
  3. 让Chrome支持Ajax/$http方式读取本地文件
  4. Glide.centerCrop()第一次显示无效
  5. ORA-29857: domain indexes and/or secondary objects
  6. P/Invoke .NET调用win32API
  7. [ActionScript 3.0] AS3.0 给flash事件传递参数的方法
  8. 【php基础】XML,DTD实例
  9. eclipse启动出现“An Error has Occurred. See the log file”解决方法
  10. 开源 免费 java CMS - FreeCMS1.5-信息管理
  11. iOS开发——常用字符串string相关方法和处理
  12. Python导入模块的三种形式
  13. Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket
  14. Ansible7:Playbook常用模块【转】
  15. R.layout.main cannot be resolved解决办法
  16. JavaScript的DOM编程--01--js代码的写入位置
  17. 【Dijkstra堆优化】洛谷P2243电路维修
  18. CSS3-1
  19. UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
  20. npm 基本使用命令

热门文章

  1. [笔记]Delphi 2007写DLL供VC调用实例
  2. PKU 3687 Labeling Balls(拓扑排序)
  3. DevOps架构实践
  4. JS正则表达式从入门到入土(2)—— 元字符和字符类
  5. go基础语法
  6. python安装包下载慢的问题 | Python
  7. 使用tcpdump 对nginx的access.log 非400的ip进行自动抓包
  8. mysql参数及解释
  9. spring junit4 测试
  10. 独家git clone 加速方法