1.文件上传前提

  • form表单的enctype取值(表单请求正文的类型)的前提是:multipart/form-data,因为默认情况下表单是以键值对的方式提交表单,而改了之后他会将表单分成几个部分,既包含表单内容,也包含文件内容
  • method必须是post
  • 提供一个文件选择域:<input type="file">
  • 需要导入两个依赖包:
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.1</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>

2.文件上传原理

其中文件解析器是解析表单中的文件项,该组件MVC已经为我们准备好了,只需要我们在配置文件中配置好就行了:

<!--配置文件解析器对象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--指定文件上传大小-->
    <property name="maxUploadSize" value="10485760"></property>
</bean>

负责文件上传的控制器函数为:

@RequestMapping("/testFileUpload")
public String testFileUpload(HttpServletRequest request, MultipartFile upload) throws Exception{
    System.out.println("SpringMVC文件上传");

    //指定上传位置
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    //判断文件夹是否存在
    File file = new File(path);
    if (!file.exists()){
        file.mkdirs();
    }

    //获取文件名
    String filename = upload.getOriginalFilename();
    //把文件名设置为为唯一值
    String uuid = UUID.randomUUID().toString().replace("-","");
    filename = uuid+"_"+filename;

    //完成上传
    upload.transferTo(new File(path,filename));

    return "success";
}