文档章节

SpringMVC中使用CommonsMultipartResolver进行文件上传

just4you
 just4you
发布于 2017/05/15 10:46
字数 549
阅读 50
收藏 0

概述:

CommonsMultipartResolver是基于Apache的Commons FileUpload来实现文件上传功能的。所以在项目中需要相应的jar文件。

FileUpload版本要求1.2及以上。相应的gradle配置:

"commons-fileupload:commons-fileupload:1.2.2"

上传方法的实现

1. 代码方式

直接在controler中new一个CommonsMultipartResolver。

@Controller
@RequestMapping(value = "/file")
public class FileController {
    	
    @RequestMapping(value = "/commUploadA")
	@ResponseBody
	public JSONObject commUploadA(HttpServletRequest request) {
		JSONObject json = new JSONObject();
		json.put("succ", false);
		try {
		    //直接new一个CommonsMultipartResolver
			CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext());
			cmr.setDefaultEncoding("utf-8");
			cmr.setMaxInMemorySize(40960);
			cmr.setMaxUploadSize(10485760000L);
			if (cmr.isMultipart(request)) {
				MultipartHttpServletRequest multipartRequest = cmr.resolveMultipart(request);
				MultipartFile file = multipartRequest.getFile("uploadFile");// 与页面input的name相同
				File imageFile = new File("d:/upload1.jpg");// 上传后的文件保存目录及名字
				file.transferTo(imageFile);// 将上传文件保存到相应位置
				json.put("succ", true);
				return json;
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return json;
	}

}

2. Xml方式

通过spring配置一个名为"multipartResolver"的bean。

<bean id="multipartResolver"
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="defaultEncoding" value="utf-8"></property>
	<property name="maxUploadSize" value="10485760000"></property>
	<property name="maxInMemorySize" value="40960"></property>
</bean>

controller中的方法做相应修改。

@Controller
@RequestMapping(value = "/file")
public class FileController {

	@RequestMapping(value = "/commUploadB")
	@ResponseBody
	public JSONObject commUploadB(MultipartHttpServletRequest request) {//参数类型不同
		JSONObject json = new JSONObject();
		json.put("succ", false);
		try {
			MultipartFile file = request.getFile("uploadFile");// 与页面input的name相同
			File imageFile = new File("d:/upload2.jpg");// 上传后的文件保存目录及名字
			file.transferTo(imageFile);// 将上传文件保存到相应位置
			json.put("succ", true);
			return json;
		} catch (Exception e) {
			e.printStackTrace();
			return json;
		}
	}
}

两种方法的区别:

  1. 将CommonsMultipartResolver的实例化由代码实现改为了xml配置实现。
  2. 方法中的参数类型由HttpServletRequest变为了MultipartHttpServletRequest。

而上传的获取和保存逻辑没有变化。

注意:

在使用xml方式时,bean的名字必须为:multipartResolver。可在org.springframework.web.servlet.DispatcherServlet中找到原因:

public class DispatcherServlet extends FrameworkServlet {

    /** Well-known name for the MultipartResolver object in the bean factory for this namespace. */
	public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
	
	......
	/**
	 * Initialize the MultipartResolver used by this class.
	 * <p>If no bean is defined with the given name in the BeanFactory for this namespace,
	 * no multipart handling is provided.
	 */
	private void initMultipartResolver(ApplicationContext context) {
		try {
			this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class);
			if (logger.isDebugEnabled()) {
				logger.debug("Using MultipartResolver [" + this.multipartResolver + "]");
			}
		}
		catch (NoSuchBeanDefinitionException ex) {
			// Default is no multipart resolver.
			this.multipartResolver = null;
			if (logger.isDebugEnabled()) {
				logger.debug("Unable to locate MultipartResolver with name '" + MULTIPART_RESOLVER_BEAN_NAME +
						"': no multipart request handling provided");
			}
		}
	}
	......
}

简要分析CommonsMultipartResolver

CommonsMultipartResolver实现接口org.springframework.web.multipart.MultipartResolver,主要作用是将HttpSerlvetRequest封装成MultipartHttpServletRequest。

public interface MultipartResolver {
    ......
    MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;
    ......
}

具体的封装方法参考CommonsMultipartResolver对resolveMultipart的实现:

org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(javax.servlet.http.HttpServletRequest)

© 著作权归作者所有

just4you
粉丝 0
博文 14
码字总数 9551
作品 0
石家庄
私信 提问
再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题

    相信很多朋友再用springmvc时都遇见了一个问题,那就是自带的获取上传的东西太慢,而且不知道如何修改,其实不然,spring框架既然给我们开放了这个接口,就一定遵从了可扩展性的原则...

Visitors
2018/07/30
0
0
Controller中servletFileUpload.parseRequest(request)解析为空

原因分析 首先我们来看下Spring mvc 中文件上传的配置 方式二 这里springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResolver这个转换器里面下面再来...

抢地主
2017/11/04
0
0
SpringMVC中servletFileUpload解析为空

原因分析 首先我们来看下Spring mvc 中文件上传的配置 再来看看Controller中使用 方式二 这里springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResol...

rock912
2015/11/04
0
0
SpringMVC处理multipart请求.

一、简述 multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部...

jmcui
2018/01/03
0
0
【spring错误】multipartResolver Bean创建错误

文件上传模块集成错误 现象 当导入spring集成的文件上传处理bean时 出现错误 解决错误 从错误提示中可以看出,是由于缺少相关的类文件的缘故。用于处理文件上传,当收到请求时 的 方法会调用...

落花时节又逢卿
2018/08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

任正非对华为热点问题的回应亮了,终于知道华为为什么能扛过这一次的冲击!

任正非对华为热点问题的回应亮了,终于知道华为为什么能扛过这一次的冲击! 如果你是华为的老板,看到一条传遍网络的“美国封锁华为”、“华为禁令”的消息,你会怎么办? 昨天上午,华为创始...

forespider
34分钟前
0
0
Java HTTP 组件库选型看这篇就够了

最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连...

Java面经
35分钟前
1
0
nginx 重启

在 nginx.config 配置目录下 输入命令: nginx -s reload 在 nginx 中,如果我修改了一个配置文件,或者新增了一个配置文件。按照群里网友的描述,我需要关闭 nginx,或者重启 nginx,比较麻...

MrBoyce
36分钟前
0
0
Cesium中级5 - Terrain 地形

Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ CesiumJS支持对与水流相关的海洋、湖泊和河流以及全球高分辨率地形进行流式处理和可视化。查看山峰、山谷...

Cesium中文网
49分钟前
0
0
搭建jupyter+nginx服务

Tips:该文章面向Mac和centos用户,如果是Windows用户,请先安装虚拟机。 概述 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter ...

阿dai学长
50分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部