好久没有写过表单上传组件了,今天在使用Apache组件测试文件上传的时候,出现了空指针异常,测试代码如下:
@Controller
public class FileUploadController {
@Autowired
private ServletContext servletContext;
@RequestMapping("/save")
public ModelAndView save(Employee emp,MultipartFile pic) {
System.out.println(emp);
String fileName=pic.getOriginalFilename();
System.out.println(fileName);
String saveDir = servletContext.getRealPath("/upload");
System.out.println(saveDir);
return null;
}
}
检查了一下我的xml配置:
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"/>
</bean>
没问题,接下来看看domain类的字段和jsp页面中表单的name是否对应:
@Data
public class Employee {
private Long id;
private String username;
private String password;
private Integer age;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date hiredate;
}
<form action="/save" method="POST" enctype="multipart/form-data">
姓名<input type="text" name="username"><br>
年龄<input type="text" name="age"><br>
文件<input type="file" name="pic"><br>
<input type="submit" value="提交">
</form>
仔细对照发现还是没问题,不死心,再跑一遍:
点击提交,报出异常:
说是第22行空指针,再看命令行打印出的employee对象:
发现该对象的所有字段都为空,很懵逼表单的数据为什么没有封装进来,接下来将表单的enctype改为"application/x-www-form-urlencoded":
<form action="/save" method="POST" enctype="application/x-www-form-urlencoded">
姓名<input type="text" name="username"><br>
年龄<input type="text" name="age"><br>
文件<input type="file" name="pic"><br>
<input type="submit" value="提交">
</form>
测试方法去掉多余的参数:
@Controller
public class FileUploadController {
@Autowired
private ServletContext servletContext;
@RequestMapping("/save")
public ModelAndView save(Employee emp) {
System.out.println(emp);
String saveDir = servletContext.getRealPath("/upload");
System.out.println(saveDir);
return null;
}
}
发现可以接收到表单数据:
这就说明了问题的所在应该是xml中配置的Apache文件上传解析没起作用,
于是不停的百度,还是找不到答案,抓狂,冷静下来突然想到该组件在配置bean的时候好像一定要加id属性,并且一定要将id的值设置为"multipartResolver"
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"/>
</bean>
重启服务器,提交表单,成功!
晕死,原来是一个不起眼的id让人折腾了大半天,以后写文件上传组件一定要记住这个细节