commons-fileupload实现上传进度条的显示
本文将使用 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互不干预)不建议用此方法
commons-fileupload实现上传进度条的显示的更多相关文章
- Java 单文件、多文件上传 / 实现上传进度条
博客地址:https://ainyi.com/76 日常,工作 在这里总结一下上传吧(是以前做过的练习,就汇总到个人博客吧) java ssm 框架实现文件上传 实现:单文件上传.多文件上传(单选和多 ...
- jQuery文件上传插件jQuery Upload File 有上传进度条
jQuery文件上传插件jQuery Upload File 有上传进度条 jQuery文件上传插件jQuery Upload File,插件使用简单,支持单文件和多文件上传,支持文件拖拽上传,有进度 ...
- HTML5矢量实现文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- 基于HT for Web矢量实现HTML5文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- PHP中使用Session配合Javascript实现文件上传进度条功能
Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP .4以前,实现这样的进度条并不容易 ...
- iOS_文件上传进度条的实现思路-AFNettworking
iOS_文件上传进度条的实现思路-AFNettworking //要上传的文件名,在这里我使用当前日期做为文件的名称 NSString * fileName =[NSString stringWith ...
- asp.net文件上传进度条研究
文章:asp.net 文件上传进度条实现代码
- ajax上传进度条
<script type="text/javascript"> function register(){ var frm = document.getElementBy ...
- Layui多文件上传进度条
Layui原生upload模块不支持文件上传进度条显示,百度,谷歌找了一下不太适用.后面找到一个别人修改好的JS,替换上去,修改一下页面显示即可使用,一下是部分代码 HTML: <div cla ...
随机推荐
- Winter-2-STL-D The Blocks Problem 解题报告及测试数据
Time Limit:3000MS Memory Limit:0KB Description Background Many areas of Computer Science use sim ...
- 了解Java应用中的开发攻击
注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是允许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能完全改变最初预计的执行过程,产生恶意效果. 下面是几种主要的注入式攻击途径 ...
- 20145312 实验五 《Java网络编程》
20145312 实验五<Java网络编程> 一. 实验内容及要求 实验内容: 运行下载的TCP代码,结对进行,一人服务器,一人客户端: 利用加解密代码包,编译运行代码,一人加密,一人解密 ...
- FASTQ format
FASTQ format 每个FASTQ文件中每个序列通常有四行信息: 1: 以 '@' 字符开头,后面紧接着的是序列标识符和可选字段的描述(类似FASTA title line). 2: 序列 3: ...
- SpringBoot中使用log4j日志
一:引入jar包 使用SpringBoot创建项目的时候,pom文件引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spr ...
- Pandas 的使用
1. 访问df结构中某条记录使用loc或者iloc属性.loc是按照index或者columns的具体值,iloc是按照其序值.访问类似于ndarray的访问,用序列分别表示一维和二维的位置. 例如: ...
- geoserver源码学习与扩展——restAPI访问
产生这篇文章的想法是在前端通过js调用restAPI时,总是不成功,发送ajax请求时还总是出现类似跨域的问题,后来查找才发现,默认情况下restAPI的访问都需要管理员权限,而通过ajax请求传输用 ...
- (转)SQL Server中的索引结构与疑惑
说实话我从没有在实际项目中使用过索引,仅知道索引是一个相当重要的技术点,因此我也看了不少文章知道了索引的区别.分类.优缺点以及如何使用索引.但关于索引它最本质的是什么笔者一直没明白,本文是笔者带着这些 ...
- django 使用form组件提交数据之form表单提交
django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...
- Android系统源代码
Android系统源代码 在线源码网站 1,http://androidxref.com 2,http://www.grepcode.com/ 3,http://www.androidos.net.c ...