spring实战-Spring文件上传MultipartFile

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tidu2chengfo/article/details/77409134

第六篇spring实战-Spring文件上传MultipartFile

在构建网站是,处理文件上传功能是必须的,比如创建用户需要用户上传头像,创建服务器列表需要上传Excel文件等等

在Springmvc中对文件上传做了比较好的支持,同时支持基于Servlet3.0的标准multipart请求(StandardServletMultipartResolver),也支持基于Jakarta的Commons FileUpload(CommonsMultipartResolver

下面主要展示标准Servlet3.0支持的方式,也推荐这种方式

1,需要在TilesWebConfig中配置MultipartResolver

	/**
	 * 使用以来servet3.0的标准multipart解析器
	 * @return
	 */
	@Bean
	public MultipartResolver multipartResolver() {
		return new StandardServletMultipartResolver();
	}
2,需要在IdatWebAppInitializer中配置MultipartConfigElement

/**
	 * 设置Servlet支持文件上传
	 * 并且上传的文件保存临时路径在/tmp/idat/uploads路径下面
	 * 单个文件大小不超过2M,一次上传所有文件大小总和不超过4M,0表示文件个数不限
	 * 如果文件大小超过限制,则会保存到临时路径下
	 */ 
	@Override
	protected void customizeRegistration(Dynamic registration) {
		registration.setMultipartConfig(new MultipartConfigElement("d:/idat/uploads",2097152,4194304,0));
		super.customizeRegistration(registration);
	}

3,文件上传表单form支持multipart/form-data

<form:form method="POST" commandName="interface" enctype="multipart/form-data">
	<form:errors path="*" element="div" cssClass="errors"></form:errors>
	<table>
		.......
		<tr>
			<td>logo</td>
			<td><input type="file" name="logo" /></td>
		</tr>
	</table>
	<input type="submit" value="create" />
</form:form>
4,处理控制器,接受并处理MultipartFile

/**
	 * 直接接受对象类型Interface 作为入参
	 * form表单中input的属性name和Interface的属性一一对应
	 * 注解@Valid启用校验功能,会按着Interface中属性的校验规则来校验入参
	 * 需要住的是后面的Errors参数需要紧跟@Valid注解的变量后面,error返回该校验参数的校验结果
	 * 但是如果希望Valid生效,还需要hibernate-validator包,或者同类实现Java Validation API的包
	 * @param intf
	 * @return
	 * @throws FileNotFoundException 
	 */
	@RequestMapping(value = "/create", method=RequestMethod.POST)
	public String create(@Valid Interface intf, Errors errors, @RequestPart("logo") MultipartFile logo) throws IOException{
		// 如果校验不通过的话,返回创建表单页面
		if (errors.hasErrors()) {
			return "createForm";
		}
		String originalFilename = logo.getOriginalFilename();
		FileOutputStream fileOutputStream = new FileOutputStream("d:/idat/"+originalFilename);
		fileOutputStream.write(logo.getBytes());
		fileOutputStream.flush();
		fileOutputStream.close();
		Interface rintf = idatService.save(intf);
		// 当视图解析器遇到 redirect:时,把他解析为重定向的规则,还有一个forward:
		// 具体redirect 和 forward 的区别 请参考 http://blog.csdn.net/tidu2chengfo/article/category/6993805
		return "redirect:queryInterfacesByName/" + rintf.getName() + "/intf";
	}

至此,我们便完成了从客户端向服务器上传提交文件

猜你喜欢

转载自blog.csdn.net/tidu2chengfo/article/details/77409134