文件上传是项目开发中最常见的功能,为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户选择的文件二进制数据发送给服务器.
一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理这涉及在服务器端解析原始的HTTP相应.2003年,Apace Software Foundation发布了开源的Commons FileUpload组件,其很快称为servlet/JSP程序员上传文件的最佳选择.
Servlet3.0规范已经提供了方法来处理文件上传,但这种上传需要在Servlet中完成.而SpringMVC则提供了更简单的封装.
SpringMVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的.SpringMVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver.因此,SpringMVC的文件上传还需要依赖ApacheCommonsFileUpload的组件.
示例:使用SpringMVC上传文件
1.修改配置
<!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 上传文件大小10M --> <property name="maxUploadSize"> <value>10240000</value> </property> <!-- 请求的编码格式,必须与视图文件的pageEncoding属性一致 --> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean>
2.上传表单
<form action="/springTest/testUpload" enctype="multipart/form-data" method="post"> <input type="text" name="description" /> <input type="file" name="file" /> <input type="submit" value="submit" /> </form>
3.控制器
@Controller public class FileUploadController { @GetMapping("/testUpload") public String testUpload( ) { return "Form8"; } @PostMapping(value="/testUpload") public String commit( HttpServletRequest request, @RequestParam("description") String description, @RequestParam("file") MultipartFile file ) throws Exception { System.out.println(description); //上传文件路径 String path = request.getServletContext().getRealPath("/images/"); //上传文件名 String filename = file.getOriginalFilename(); File filepath = new File(path,filename); //判断路径是否存在如果不存在就创建 if(!filepath.getParentFile().exists()) { filepath.getParentFile().mkdirs(); } System.out.println(path+File.separator+filename); //将上传文件保存到目标路径当中 file.transferTo(new File(path+File.separator+filename)); return "uploadSuccess"; } }
SpringMVC会将上传文件绑定到MultipartFile对象中,MutipartFile提供了获取上传文件内容,文件名等方法.通过transferTo()方法还可以将文件存储到硬件中,Multipart对象中的常用方法如下:
byte[] getBytes():获取文件数据
String getContentType():获取文件MIME类型,如image/jpeg等
InputStream getInputStream():获取文件流
String getName():获取表中文件主键的名字
String getOriginalFilename():获取上传文件的原名
long getSize():获取文件的字节大小,单位为byte
boolean isEmpty():是否有上传文件
void transferTo(File dest):将上传文件保存到一个目标文件中