我本人在网上找了很多关于文件上传进度获取的文章,普遍基于spring MVC 框架通过 fileUpload 实现,对于spring Boot 通过 fileUpload 实现的帖子非常少,由于小弟学艺不精,虽然 Spring Boot 和 Spring MVC 相差不大,只是配置方式的差别,还是搞了很久,上传此文章的目的是希望自己作为文本保留,以便日后查看备忘,并且希望通过我的例子可以帮助到其他人而已,如果各位大佬发现小弟对于某些知识有误解,还请不吝赐教,先谢谢各位前辈了!

写此篇文章之前我查了很多关于spring MVC 框架通过 fileUpload 实现进度条的帖子和文章,在此对各位作者表示感谢!

本功能基于commons fileUpload 组件实现

1.首先,不能在程序中直接使用 fileUpload.parseRequest(request)的方式来获取 request 请求中的 multipartFile 文件对象,原因是因为在 spring 默认的文件上传处理器 multipartResolver 指向的类CommonsMultipartResolver 中就是通过 commons fileUpload 组件实现的文件获取,因此,在代码中再次使用该方法,是获取不到文件对象的,因为此时的 request 对象是不包含文件的,它已经被CommonsMultipartResolver 类解析处理并转型。

CommonsMultipartResolver 类中相关源码片段:

protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {

String encoding = determineEncoding(request);

FileUpload fileUpload = prepareFileUpload(encoding);

try {

List fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);

return parseFileItems(fileItems, encoding);

}

catch (FileUploadBase.SizeLimitExceededException ex) {

throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);

}

catch (FileUploadBase.FileSizeLimitExceededException ex) {

throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);

}

catch (FileUploadException ex) {

throw new MultipartException("Failed to parse multipart servlet request", ex);

}

}

2.由于spring 中的 CommonsMultipartResolver 类中并没有加入 processListener 文件上传进度监听器,所以,直接使用 CommonsMultipartResolver 类是无法监听文件上传进度的,如果我们需要获取文件上传进度,就需要继承 CommonsMultipartResolver 类并重写 parseRequest 方法,在此之前,我们需要创建一个实现了 processListener 接口的实现类用于监听文件上传进度。

processListener接口实现类:

import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;

import org.springframework.stereotype.Component;

@Component

public class UploadProgressListener implements ProgressListener{

private HttpSession session;

public void setSession(HttpSession session){

this.session=session;

ProgressEntity status = new ProgressEntity();

session.setAttribute("status", status);

}

/*

* pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件

*/

@Override

public void update(long pBytesRead, long pContentLength, int pItems) {

ProgressEntity status = (ProgressEntity) session.getAttribute("status");

status.setpBytesRead(pBytesRead);

status.setpContentLength(pContentLength);

status.setpItems(pItems);

}

}

ProgressEntity 实体类:

import org.springframework.stereotype.Component;

@Component

public class ProgressEntity {

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() {

float tmp = (float)pBytesRead;

float result = tmp/pContentLength*100;

return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="

+ pContentLength + ", percentage=" + result + "% , pItems=" + pItems + "]";

}

}

最后,是继承 CommonsMultipartResolver 类的自定义文件上传处理类:

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 UploadProgressListener uploadProgressListener;

@Override

protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {

String encoding = determineEncoding(request);

FileUpload fileUpload = prepareFileUpload(encoding);

uploadProgressListener.setSession(request.getSession());//问文件上传进度监听器设置session用于存储上传进度

fileUpload.setProgressListener(uploadProgressListener);//将文件上传进度监听器加入到 fileUpload 中

try {

List fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);

return parseFileItems(fileItems, encoding);

}

catch (FileUploadBase.SizeLimitExceededException ex) {

throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);

}

catch (FileUploadBase.FileSizeLimitExceededException ex) {

throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);

}

catch (FileUploadException ex) {

throw new MultipartException("Failed to parse multipart servlet request", ex);

}

}

}

3.此时,所有需要的类已经准备好,接下来我们需要将 spring 默认的文件上传处理类取消自动配置,并将 multipartResolver 指向我们刚刚创建好的继承 CommonsMultipartResolver 类的自定义文件上传处理类。

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration;

import org.springframework.boot.web.servlet.ServletComponentScan;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.multipart.MultipartResolver;

import com.example.listener.CustomMultipartResolver;

/*

* 将 spring 默认的文件上传处理类取消自动配置,这一步很重要,没有这一步,当multipartResolver重新指向了我们定义好

* 的新的文件上传处理类后,前台传回的 file 文件在后台获取会是空,加上这句话就好了,推测不加这句话,spring 依然

* 会先走默认的文件处理流程并修改request对象,再执行我们定义的文件处理类。(这只是个人推测)

* exclude表示自动配置时不包括Multipart配置

*/

@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})

@Configuration

@ComponentScan(basePackages = {"com.example"})

@ServletComponentScan(basePackages = {"com.example"})

public class UploadProgressApplication {

/*

* 将 multipartResolver 指向我们刚刚创建好的继承 CommonsMultipartResolver 类的自定义文件上传处理类

*/

@Bean(name = "multipartResolver")

public MultipartResolver multipartResolver() {

CustomMultipartResolver customMultipartResolver = new CustomMultipartResolver();

return customMultipartResolver;

}

public static void main(String[] args) {

SpringApplication.run(UploadProgressApplication.class, args);

}

}

至此,准备工作完成,我们再创建一个测试用的 controller 和 html 页面用于文件上传。

controller:

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.multipart.MultipartFile;

import org.springframework.web.servlet.ModelAndView;

@Controller

@RequestMapping("/uploadProgress")

public class UploadController {

@RequestMapping(value = "/showUpload", method = RequestMethod.GET)

public ModelAndView showUpload() {

return new ModelAndView("/UploadProgressDemo");

}

@RequestMapping("/upload")

@ResponseBody

public void uploadFile(MultipartFile file) {

System.out.println(file.getOriginalFilename());

}

}

HTML:

测试这里写代码片

这是文件上传页面

经本人测试,确实可以获取文件上传进度,前台页面修改进度条进度可以采用前台页面轮询的方式访问后台,在相应action中通过存储在session中的对象 status 来获取最新的上传进度并返回展示即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java fileupload 进度_SpringBoot+fileUpload获取文件上传进度相关推荐

  1. html如何显示上传进度条,HTML5 Ajax文件上传进度条如何显示

    这篇文章主要介绍了HTML5 Ajax文件上传进度条是如何显示的,基于原生html5实现,不需要falsh支持,进度可以自定义显示,控制灵活,对HTML5上传进度条感兴趣的小伙伴们可以参考一下 原本打 ...

  2. jquery和php上传文件进度条,jQuery实现文件上传进度条特效_jquery

    上传进度条通常是由前面jquery加后端了脚本器脚本来实现了,今天我们介绍的是一款基本php+jQuery实现文件上传进度条效果的例子,具体细节如下. 最近呢,一个项目做一个进度条的效果出来,这个之前 ...

  3. php获取文件上传进度,PHP使用APC获取上传文件进度

    今天发现使用PHP的APC也能获取上传文件的进度.这篇文章就说下如何做. 安装APC 首先安装APC的方法和其他PHP模块的方法没什么两样,网上能找出好多 phpinfo可以看到APC的默认配置有: ...

  4. 大文件上传 进度条显示(仿CSDN资源上传效果) .

    浏览-选择文件-点击 "上传 "后,效果如下: 弹出透明UI遮罩层 并显示上传这个过程 我这里设置太透明了 效果不是很立体 文件结构如图: 说明:用到"高山来客" ...

  5. 大文件上传 进度条显示(仿CSDN资源上传效果)

    浏览-选择文件-点击 "上传 "后,效果如下: 弹出透明UI遮罩层 并显示上传这个过程 我这里设置太透明了 效果不是很立体 文件结构如图: 说明:用到"高山来客" ...

  6. Java Web项目中遇到的文件上传与下载问题

    (转发自:https://www.cnblogs.com/xdp-gacl/p/4200090.html)   在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中 ...

  7. js实现文件上传进度条功能

    开发中可能会涉及到需要展示文件上传进度条显示,方便用户知道文件的上传状态.其实进度条展示只需要拿到文件已上传的大小,和被上传文件的总大小即可.废话不多说直接上代码!! class fileUpload ...

  8. django文件——django + jquery-file-upload上传篇(二)-- 插件实现文件上传+进度条显示 +拖入文件上传...

    django + jquery-file-upload 插件实现文件上传+进度条显示 1.model.py class Fujian(models.Model):name = models.CharF ...

  9. dropzone java实例_Java实现拖拽文件上传dropzone.js的简单使用示例代码

    Java实习生一枚,前端知识薄弱,最近因为工作需要,做了一个拖拽文件上传的功能,发现dropzone.js挺不错的,特地做个笔记. 自己写的拖拽文件至一个按钮上传的功能,前端及java代码如下: js ...

最新文章

  1. 小工匠聊架构-布隆过滤器在亿级流量的电商系统中的应用
  2. yum安装MariaDb10.2国内yum源配置
  3. appium for mac 安装与测试ios说明
  4. Maven+Spring+CXF+Tomcat7 简单例子实现webservice
  5. 深入JS正则先行断言
  6. SharePoint 2010新特性Ribbon
  7. 关于 SpringCloud 配置,你了解多少?
  8. 装饰效果(最大连续字段和)
  9. 获取referer中的请求参数_http请求的referer属性
  10. jquery中checkbox全选失效的解决方法
  11. JBoss AS 7中Domain Mode 和 Standalone Mode
  12. python神经网络编程 代码,python神经网络编程 豆瓣
  13. ElasticKibana 安装部署
  14. CSS 中iframe标签
  15. 银行卡怎么突然收不到短信信息服务器,银行卡开通了短信通知功能为什么没收到通知?十条原因看清楚...
  16. 科学家量子计算机时间倒流,腾讯内容开放平台
  17. MacW资讯:设置苹果Mac电脑的开机密码
  18. Bouncy Castle 的 ASN1 使用方法
  19. cad导出pdf_快速导图-----橄榄山一键导出CAD、PDF
  20. 浅析人工智能技术对于视频监控发展的意义

热门文章

  1. 搭建论坛如何选择服务器
  2. python内置函数布尔值bool用法详解
  3. 黑阔主流攻防之加密与解密的对抗二
  4. webrtc部分手机黑屏的原因排查
  5. lua版本base64加密和解密
  6. 深入浅出WPF知识点汇总一
  7. 学习 Go 语言 0x09:《Go 语言之旅》中练习使用 Reader
  8. 计算机病毒指的是什么及特性,什么是计算机病毒 什么是计算机病毒
  9. wex5 生成动态轮播图代码
  10. Axure9 最新授权码,持续更新中