SpringMVC中使用CommonsMultipartResolver进行文件上传

概述:

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)

转载于:https://my.oschina.net/u/2610965/blog/899981

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值