单文件上传
- 环境:myeclipse 2018 jdk1.8 tomcat9.0
- 使用框架:SpringMVC
按照以下步骤是环境、框架已经配置好的基础上哦
1.前台jsp页面中
一定要有的:
form表单 post提交 enctype=“multipart/form-data”
2.Pom.xml文件中加入两个jar包
<!-- 文件上传需要导入的jar包 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
3.后台,action中,前台的uploadfile可以用MultipartFile类对象来接收
4.项目结构先看一下
5.在Spring-mvc.xml中配置文件上传解析器
MultipartResolver(限制上传文件的大小)和文件上传的路径
因为限制了上传文件的大小所以超出限制之后会报错,为了防止页面出现500的错误,我们希望在界面上可以提示用户“上传文件超过限制大小”的提示。
<!-- 文件上传解析器:配置 MultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 单个文件的 大小 -->
<property name="maxInMemorySize" value="65536000"></property>
<!-- 每次上传的总大小 -->
<property name="maxUploadSize" value="1310720000"></property>
</bean>
<!-- 文件上传路径 配置文件配置 -->
<!-- PropertiesFactoryBean 用来读取 和 注入 properties配置文件的内容的-->
<bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
</bean>
<!-- 配置全局异常处理器 -->
<bean id="handlerExceptionResolver"
class="com.b_exception.CustomExceptionResolver"></bean>
1)配置全局的异常处理器
自定义一个全局异常处理器类,去实现HandlerExceptionResolver ,其中,只有一个方法需要覆盖,在该方法中用instanceof 关键字 判断是属于哪一个异常,并返回一个视图
package com.b_exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomExceptionResolver implements HandlerExceptionResolver{
/**
*
* SpringMVC所抛出来的所有异常 都 交到这里来处理
*
*/
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
ModelAndView model = null;
//打印异常的栈信息
ex.printStackTrace();
//文件上传的异常
if(ex instanceof MaxUploadSizeExceededException){
//整个文件上传不能超过 128kb
//创建一个ModelAndView
model = new ModelAndView("/file_load");
//错误信息
model.addObject("error_message", "文件上传总大小不能超过128kb");
}else if(ex instanceof SizeLimitExceededException){
//单个文件上传不能超过64kb
//创建一个ModelAndView
model = new ModelAndView("/file_load");
//错误信息
model.addObject("error_message", "文件上传总大小不能超过128kb");
}else if(ex instanceof FileSizeLimitExceededException){
//创建一个ModelAndView
model = new ModelAndView("/file_load");
//错误信息
model.addObject("error_message", "单个文件上传总大小不能超过64kb");
}/*else if(ex instanceof CustomException){
//创建一个ModelAndView
model = new ModelAndView("/500");
//错误信息
model.addObject("error_message", ex.getMessage());
}*/
return model;
}
}
6.action中添加一个方法
@RequestMapping("upload")
public ModelAndView upload(MultipartFile uploadfile) {
String fileName = uploadfile.getOriginalFilename();
String Name = uploadfile.getName();
String contentType = uploadfile.getContentType();
long size = uploadfile.getSize();
System.out.println("文件名:"+fileName);
System.out.println("input的name值"+Name);
System.out.println("文件类型"+contentType);
System.out.println("文件大小"+size);
return null;
}
7.写jsp页面
<body>
<h1>单文件上传</h1>
<font color="red"></font>
<form action="${path}/upload/upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="uploadfile">
<input type="submit" value="上传">
</form>
<div style="color:red"> </div>
<h1>多文件上传</h1>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="filename1"><br/>
<input type="file" name="filename2"><br/>
<input type="file" name="filename3"><br/>
<input type="submit" value="上传">
</form>
</body>
8.在Action的upload()方法中,将上传的文件通过后台保存到服务器中,添加代码(使用了FileUtils工具类)
@RequestMapping("upload")
public ModelAndView upload(MultipartFile uploadfile,ModelMap modelmap) {
String fileName = uploadfile.getOriginalFilename();
String Name = uploadfile.getName();
String contentType = uploadfile.getContentType();
long size = uploadfile.getSize();
System.out.println("文件名:"+fileName);
System.out.println("input的name值"+Name);
System.out.println("文件类型"+contentType);
System.out.println("文件大小"+size);
/**
* 用户上传一个文件,后台把文件保存到服务器中
* 使用工具类(FileUtils)来完成
*/
try {
FileUtils.copyInputStreamToFile(uploadfile.getInputStream(), new File( "E:/temp/"+fileName ));
modelmap.addAttribute("message", "文件上传成功!");
modelmap.addAttribute("fileName", fileName);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
modelmap.addAttribute("message", "文件上传失败!");
}
return new ModelAndView("/success");
}
Success.jsp
<body>
<span>${message }</span> 文件名:${fileName }
</body>
9.测试
上传成功显示success.jsp界面
否则 提示用户上传文件超过限制