文件上传两种方法:
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";
}