springmvc 后台实现监听上传文件大小及进度

一、首先需要自定义一个监听进度的listener

     

import javax.servlet.http.HttpSession;
 
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;

 
@Component
public class FileUploadProgressListener 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) {
      //System.out.println("正在更新:pBytesRead="+pBytesRead+",pContentLength="+pContentLength+",pItems="+pItems);
      Progress status = (Progress) session.getAttribute("status");
      status.setpBytesRead(pBytesRead);
      status.setpContentLength(pContentLength);
      status.setpItems(pItems);
      Progress status1 = (Progress) session.getAttribute("status");
      //System.out.println("session更新了:pBytesRead="+status1.getpBytesRead()+",pContentLength="+status1.getpContentLength()+",pItems="+status1.getpItems());
   }
 
}

二、将自定义的listener注入到解析multimultipartResolver里面,实现上传文件的数据不断更新

import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

 
public class CustomMultipartResolver extends CommonsMultipartResolver {
    @Autowired
   private FileUploadProgressListener progressListener;
   
   public void setFileUploadProgressListener(FileUploadProgressListener progressListener){
      this.progressListener=progressListener;
   }
   
   @Override
   @SuppressWarnings("unchecked")
   public MultipartParsingResult parseRequest(HttpServletRequest request)
         throws MultipartException {
      String encoding = determineEncoding(request);
      FileUpload fileUpload = prepareFileUpload(encoding);
      progressListener.setSession(request.getSession());
      fileUpload.setProgressListener(progressListener);
      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);
      }
   }
}

三、自定义Progress类来封装listener更新的数据

/**
 * Created by liudaxia on 2018/7/10.
 */
public class Progress {

    /**
     * long pBytesRead, long pContentLength, int pItems
     */

    private long pBytesRead;
    private long pContentLength;
    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 "Progress{" +
                "pBytesRead=" + pBytesRead +
                ", pContentLength=" + pContentLength +
                ", pItems=" + pItems +
                '}';
    }
}

四、写个controller不断供前台进行调用

@Controller
@SessionAttributes("status")
public class ProgressController {
 
   @RequestMapping(value = "/upfile/progress")
    @ResponseBody
   public String initCreateInfo(Map<String, Object> model) {
      Progress status = (Progress) model.get("status");
      if(status==null){
         return "{}";
      }
      System.out.println(status.toString());
      return status.toString();
   }
}


五、修改xml文件

<bean id="multipartResolver"
      class="此处改为自己定义的CustomMultipartResoler">
    <property name="maxUploadSize" value="4194304000" />
    <property name="maxInMemorySize" value="1048576" />
</bean>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值