java spring 文件上传监听 控制条显示

1、        接管CommonsMultipartResolver,重写针对文件上传的请求。

package com.sinosoft.amoeba.fileupload;

import com.sinosoft.amoeba.fileupload.listener.FileUploadProgressListener;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 *
重写CommonsMultipartResolver以监听文件上传进度
 * @author gf
 * @date 2016-12-2
 */
public class CustomMultipartResolverextends CommonsMultipartResolver {
  
   privateHttpServletRequest request;
  
    protectedFileUpload newFileUpload(FileItemFactory fileItemFactory) {
        ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
        upload.setSizeMax(-1);
        if (request != null) { 
           HttpSession session = request.getSession();
           FileUploadProgressListenerprogressListener = new FileUploadProgressListener(session);
            upload.setProgressListener(progressListener); 
        } 
        returnupload; 
    } 
   
    publicMultipartHttpServletRequest resolveMultipart(HttpServletRequestrequest) throws MultipartException{
       // 获取到request,要用到session
        
this.request =request;
        returnsuper.resolveMultipart(request); 
    } 
  
   @Override
   publicMultipartParsingResult parseRequest(HttpServletRequest request)throws MultipartException {
      HttpSession session =request.getSession();
      String encoding =determineEncoding(request);
      FileUpload fileUpload =prepareFileUpload(encoding);
      FileUploadProgressListenerprogressListener = new FileUploadProgressListener(session);
     fileUpload.setProgressListener(progressListener); 
      try {
         List<FileItem> fileItems =((ServletFileUpload) fileUpload).parseRequest(request);
         returnparseFileItems(fileItems, encoding);
      } catch(FileUploadBase.SizeLimitExceededException ex) {
         thrownew MaxUploadSizeExceededException(fileUpload.getSizeMax(),ex);
      } catch(FileUploadException ex) {
         thrownew MultipartException("Could not parse multipart servlet request", ex);
      }
   }
}

2、        写入监听,获取记录上传进度

package com.sinosoft.amoeba.fileupload.listener;

import com.sinosoft.amoeba.fileupload.model.Progress;import org.apache.commons.fileupload.ProgressListener;

import javax.servlet.http.HttpSession;

/** *  * 创建人:gf * 创建时间:2016-12-1 <br> * 功能描述: 文件上传进度<br> */public class FileUploadProgressListener implements ProgressListener {      private HttpSession session;

   public FileUploadProgressListener() {  }         public FileUploadProgressListener(HttpSession session) {        this.session=session;        Progress status = new Progress();        session.setAttribute("upload_ps", status);      }        /**    * pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件    */   private long old=0;   public void update(long pBytesRead, long pContentLength, int pItems) {      Progress status = (Progress) session.getAttribute("upload_ps");      status.setpBytesRead(pBytesRead);      status.setpContentLength(pContentLength);      status.setpItems(pItems);      //System.out.println("已经传送了:"+pBytesRead+"--------------文件总大小为:"+pContentLength+"-----第"+pItems+"个");      /*System.out.println("文件总大小为:"+pContentLength);*/

      if(old>pBytesRead) {         String a="";      }else {         old=pBytesRead;      }      session.setAttribute("upload_ps", status);   }}

3、        通过Progress类接收上传文件参数

package com.sinosoft.amoeba.fileupload.model;

/** *  * 创建人:gf <br> * 创建时间:2016-12-2 <br> * 功能描述: 文件上传进度<br> */public class Progress {

   private long pBytesRead = 0L;   private long pContentLength = 0L;   private int pItems;   public long getpBytesRead() {      return pBytesRead;   }   public void setpBytesRead(long pBytesRead) {      this.pBytesRead = pBytesRead;   }   public long getpContentLength() {      return pContentLength;   }   public void setpContentLength(long pContentLength) {      this.pContentLength = pContentLength;   }   public int getpItems() {      return pItems;   }   public void setpItems(int pItems) {      this.pItems = pItems;   }   @Override   public String toString() {      return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="            + pContentLength + ", pItems=" + pItems + "]";   }

}

4、        配置XML文件

<!--文件上传监听--><bean id="multipartResolver" class="com.sinosoft.amoeba.fileupload.CustomMultipartResolver">    <property name="defaultEncoding" value="UTF-8"/>    <!-- 内存缓存1M -->    <property name="maxInMemorySize" value="1000000"></property>    <!--这里限制了上传最大数 在程序中需要控制 否在总大小为-1了就 超出了-->    <property name="maxUploadSize" value="10147483648"/></bean>

5、        获取监听数据以及进度条展示

Jsp代码:

<label id="progress" style="position: relative;left: 10px;top:5px ">    保存进度:    <div id="proBack" style="width: 400px;height: 5px;margin-top:-10px;margin-left:60px;background:gray;">        <div id="proUp" style="width: 0px;height: 5px;background:red;">        </div>    </div>    <label id="progressId"  style="margin-left: 465px;position: relative;top: -11px"></label></label>
 

Js代码

//放到上传文件时候
setInterval(getProgress,100);
// getProgress方法
function getProgress() {        $.ajax({            url:ctx+"/compact/getProgress",            type:"get",            dataType:"text",            async: false,            success:function(data) {                var backGroundWidth = $("#proBack").width();                var proUpWidth = (backGroundWidth*data.replace("%",""))/100;                $("#proUp").width(proUpWidth);                $("#progressId").text(data);                if(data==‘100%‘) {                    upFile=false;                }            },            error:function(data) {                msgAlert("系统消息","出错了!");            }        });}
java代码:
Progress status = (Progress) request.getSession().getAttribute("upload_ps");
//已上传字节数
status.getpBytesRead();
//总字节数
status.getpContentLength()
//根据需要返回上传百分比即可
 
 
 
但是这种情况对服务器访问次数太多,用户太多或者服务器性能不好这么做不太好。
另一种实现方式为做一个假的进度条或者转动的圆圈,当文件没有上传成功就一直转,上传成功,弹出保存成功,即可
 
 
 
时间: 2024-12-21 21:06:54

java spring 文件上传监听 控制条显示的相关文章

ajax+spring文件上传

1.js代码 $(function(){ $('#upfileID').change(function(){ $.ajaxFileUpload({ url: '/upload/image', type: 'post', secureuri: false, //一般设置为false fileElementId: 'upfileID', // 上传文件的id属性名 dataType: 'text', //返回值类型,一般设置为json.application/json success: functi

java多线程文件上传服务器

描述: (1)jdk自带线程池见 JDK自带线程池配置 (2)此上传文件服务器中上传文件的后缀名通过第一段缓冲字符流传递,此缓冲字符流大小为1024,在文件接收端以1024接收.处理. 1.服务器代码如下(使用jdk自带线程池): 1 /** 2 * 服务器处理多线程问题 3 * 4 * 1.因为服务器是要很多人访问的,因此里面一定要用多线程来处理,不然只能一个人一个人的访问,那还叫Y啥服务器 5 * 6 * 2,拿上面这个文件上传的例子来说,它将每个连接它的用户封装到线程里面去,把用户要执行的

Java Socket文件上传

客户端: import java.io.FileInputStream; import java.net.Socket; /** * Created by 290248126 on 14-5-11. */ public class Client { public static void main(String[] args) throws Exception { FileInputStream fileInputStream = new FileInputStream("e:/1.png&quo

Java Web文件上传

一. Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个: commons-fileupload commons-io 二.前端代码示例: <form method="post" id="uploadApkForm" action="uploadapk" enctype="multipart/form-data"> <p> 文件:<input name="

java的文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st

java 大文件上传 断点续传 完整版实例 (Socket、IO流)

原文出自:https://blog.csdn.net/seesun2012 java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操作 2.服:使用ServerSocket.accept()方法进行阻塞,接收客户端请求 3.服:每接收到一个Socket就建立一个新的线程来处理它 4.客:利用Socket进行远程连接,询问已上传进度 5.客:使用File

(转)Spring文件上传,包括一次选中多个文件

背景: http://www.cnblogs.com/lixuwu/p/8495275.html已经实现了单文件的上传和下载,多文件的上传是另一种情景,这里记录下来 实现过程 先说前台. 运行以后就是这样子的. 一个非常简单的表单页面, 两个文件上传按钮, 一个提交 其中单个文件上传, 即只能选择一个文件, 无法同时选择多个 相对的, 多个文件就是可以同时选择多个文件了 文件选择以后就是这个样子 前台设置 代码如下: 一个form, 文件上传就是一个<input>输入, 属性type=&quo

java实现文件上传和下载

写在前面 [文件上传和下载]是很多系统必备功能, 比如PM\OA\ERP等:系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的[应用层http]进行数据传输,后者主要通过编程语言开发的app作为客户端来访问服务端,一般采用七层协议中的[传输层tcp]进行数据传输. 文章主要完成简单java web涉及的文件上传和下载功能. 正文 1. java原生servlet实现: pom.xml配置: <dependency> <groupId>

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.