Spring MVC–Multipart数据处理分析
Multipart数据处理其实就是SpringMVC的文件上传。是SpringMVC对原生Servlet的封装,使用起来更加方便。
下面我们一起来看一下实现文件上传的整个代码实现流程:
首先我们需要再pom.xml中引入一个jar包
<!--文件上传所需要jar-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
配置文件上传的解析器
这里我们使用multipartResolver多元素解析器,再property里设置上传文件最大限制,这里的value是按照字节数进行限制,如果为-1表示没限制
<!--多元素解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置上传文件大小上限,单位是字节,-1代表没有限制也是默认的-->
<property name="maxUploadSize" value="5000000" />
</bean>
jsp代码
我们使用表单的post请求,将form的enctype属性设置为multipart/form-data。
<div>
<fieldset>
<form method="post" action="/demo/upload" enctype="multipart/form-data">
<input type="file" name="uploadFile" />
<input type="submit" value="上传"/>
</form>
</fieldset>
</div>
后台接口代码
首先我们再SpringMVC上传文件时,后台代码接收文件参数我们使用一个比较特殊的类型MultipartFile接取,我们先去获取文件的后缀,然后将文件改为唯一标识的UUID名称,然后考虑到存储路径下的文件数限制,我们根据日期在目标目录下创建子文件夹,最后调用transferTo方法将文件放入子文件夹,完成整个上传的流程。
@RequestMapping("/upload")
public ModelAndView upload(MultipartFile uploadFile, HttpSession session) throws IOException {
//处理上传文件
//重命名,获取后缀
//原始名称
String originalFilename = uploadFile.getOriginalFilename();
//扩展名
String newFilename =originalFilename.substring(originalFilename.indexOf("."),originalFilename.length());
String newName = UUID.randomUUID().toString()+"."+newFilename;
//存储,要存储到指定文件夹下 /upload 考虑文件数上限,按照日期生成子文件夹
String realPath = session.getServletContext().getRealPath("/uploads");
String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
File file = new File(realPath + "/" + datePath);
if(!file.exists()){
file.mkdirs();
}
Date date = new Date();
uploadFile.transferTo(new File(file,newName));
ModelAndView modelAndView = new ModelAndView();
//addObject 其实是向请求域中request.setAttribute("date",date);
modelAndView.addObject("date",date);
//封装跳转的页面信息/WEB-INF/jsp/success.jsp物理试图名
//success逻辑视图名
modelAndView.setViewName("success");
return modelAndView;
}