Spring实战15——Spring MVC文件上传

文件上传两种方法:

1.CommonsMultipartResolver:使用Jakarta Commons FileUpload 解析 multipart 请求。Spring 3.1 前。

2.StandardServletMultipartResolver:依赖于Servlet 3.0对multipart 请求的支持。Spring 3.1后。


使用StandardServletMultipartResolver:

1.在配置类中声明为bean

    @Bean
    public MultipartResolver multipartResolver() throws IOException {
    	return new StandardServletMultipartResolver();
    	
    	//若为CommonsMultipartResolver
//    	CommonsMultipartResolver cmr = new CommonsMultipartResolver();
//    	cmr.setUploadTempDir(new FileSystemResource("E:\\abc\\pictures"));
//    	cmr.setMaxUploadSize(2014*2014*2);
//    	cmr.setMaxInMemorySize(0);//内存中大小即临时存储在内存中为0,则立即写到磁盘中
//    	return cmr;
    }

2.配置限制条件,上传大小等。有三种方式:

(1).当DispatcherServlet 实现WebApplicationInitializer 注册到servlet 上下文时,可以在Servlet registration 上调用setMultipartConfig 方法,
(2).当DispatcherServlet 继承AbstractAnnotationConfigDispatcherServletInitializer或AbstractDispatcherServeltInitializer 时,可以重写customizeRegistration 方法
(3).当DispatcherServlet 是在web.xml 中配置的,则使用web.xml配置

代码如下:

(1)当DispatcherServlet 实现WebApplicationInitializer 注册到servlet 上下文时

DispatcherServlet ds = new DispatcherServlet();
Dynamic registration = context.addServlet("dispatcherServlet",ds);
registration.addMapping("/");
registration.setMultipartConfig(new MultipartConfigElement("..."));

(2)当DispatcherServlet 继承AbstractAnnotationConfigDispatcherServletInitializer或AbstractDispatcherServeltInitializer 时,

public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
	
    @Override
	protected void customizeRegistration(Dynamic registration) {
		registration.setMultipartConfig(
				new MultipartConfigElement("E:/abc/pictures/aa", 1024*1024*2, 1024*1024*4, 0));
		//文件最大2MB,请求最大4MB,0是默认上传时写到磁盘,此路径是临时路径。。。。
	}
	
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {RootConfig.class};
    }
    
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
    
}

(3)若DispatcherServlet 是在web.xml 中配置的,则

    <servlet>
		<servlet-name>DispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		
		<load-on-startup>1</load-on-startup>
		
		<!-- StandardServletMultipartResolver的配置文件上传条件 -->
		<multipart-config>
			<location>E:/abc/pictures/aa</location>
			<max-file-size>2097152</max-file-size>
			<max-request-size>4194304</max-request-size>
		</multipart-config>
		
	</servlet>
	
	<servlet-mapping>
		<servlet-name>DispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

3.fileupload.jsp,注意enctype="multipart/form-data" 

<form action="/Maven_SpringMVC_2/multi/fileupload" method="post" enctype="multipart/form-data">
	<input type="file" name="picture" accept="image/jpeg, image/png, image/gif">
	<input type="submit" value="上传图片">
</form>

4.Controller
   参数类型有几种:
   (1).Spring 提供的MultipartFile,用来处理上传的文件,需要配置MultipartResolver解析器;
   (2).也可以是byte[] 数组来接收
   (3).Part 接口,不需配置MutipartResolver。使用和MultipartFile相差不大,只是用write 来写,相当于transferTo

	@RequestMapping(value = "/fileupload", method = RequestMethod.POST)
	public String processFileUplaod(@RequestPart("picture") MultipartFile picture) {
		try {
			String[] names = picture.getOriginalFilename().split("\\\\");	
			String filename = names[names.length-1];
			
			picture.transferTo(new File("E:/abc/pictures/" + filename));//存储路径
		} catch (Exception e) {
			e.printStackTrace();
			throw new FailToUploadException();
		}
		return "ok";//如果异常。。使用控制器通知来重定向异常界面
	}
	
	@RequestMapping(value = "/fileupload2", method = RequestMethod.POST)
	public String processFileUplaod2(@RequestPart("picture") byte[] picture) {
		try {
			FileOutputStream fos = new FileOutputStream("E:/abc/pictures/abd.jpg");
			fos.write(picture);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "ok";
	}

猜你喜欢

转载自blog.csdn.net/pigqhf/article/details/89311916