springMVC提供了两种文件上传的方式,一种是自己写输入到本地,另一种是借助springMVC封装好的MultipartHttpServletRequest上传文件。
上传文件所需的两个jar包:
com.springsource.org.apache.commons.fileupload
com.springsource.org.apache.commons
注意:
1.上传文件无论用什么框架都需要用到“enctype”属性
2.必须采用method方式
配置文件:
1.web.xml
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/springAnnotation-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- encoding filter for jsp page -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2. springAnnotation-servlet.xml文件
<!-- 注解扫描包 -->
<context:component-scan base-package="com.tgb.web.controller.annotation" />
<!-- 开启注解 -->
<mvc:annotation-driven/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<!-- 指定所上传文件的总大小。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>
CommonsMultipartResolver允许设置的属性有:
- defaultEncoding:表示用来解析request请求的默认编码格式,当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。当request自己指明了它的编码格式的时候就会忽略这里指定的defaultEncoding。
- uploadTempDir:设置上传文件时的临时目录,默认是Servlet容器的临时目录。
- maxUploadSize:设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。
- maxInMemorySize:设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240。
3. jsp页面:
<body>
<h>添加用户</h>
<form name="userForm" action="/springMVC7/file/upload2" method="post" enctype="multipart/form-data" >
选择文件:<input type="file" name="file">
<input type="submit" value="上传" >
</form>
</body>
4.方式一:手动输入本地文件
@RequestMapping("/upload1")
public String addUser(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException{
输出file名称
System.out.println("fileName---->" + file.getOriginalFilename());
if(!file.isEmpty()){
try {
//将文件放到D盘的根目录
FileOutputStream os = new FileOutputStream("D:/" + new Date().getTime() + file.getOriginalFilename());
//获取输入流
InputStream in = file.getInputStream();
//写文件
int b = 0;
while((b=in.read()) != -1){
os.write(b);
}
os.flush();
os.close();
in.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "/success";
}
4.方式二:采用封装好的MultipartHttpServletRequest上传文件
@RequestMapping("/upload2")
public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{
//定义一个解释器,解析request,拿到springMVC初始化的上下文,解析上下文
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断request是否为map类型数据
if(multipartResolver.isMultipart(request)){
//转换SpringMVC封装好的文件类型
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//定义迭代器获取文件名称
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//获取文件,MultipartFile定义文件类型
MultipartFile file = multiRequest.getFile((String)iter.next());
if(file != null){
//定义输出文件名称
String fileName = "demoUpload" + file.getOriginalFilename();
//定义输出路径
String path = "D:/" + fileName;
//new 一个文件类型
File localFile = new File(path);
//将上传文件转到本地文件
file.transferTo(localFile);
}
}
}
return "/success"; //返回成功页面
}
}
在使用第二种方式时,需要在配置文件springAnnotation-servlet.xml中配置MultipartResolver处理器。