SpringMVC文件上传

文件上传是项目开发中最常见的功能,为了能上传文件,必须将表单的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):将上传文件保存到一个目标文件中