springmvc教程-上传文件

介绍

文本介绍上传文件

springmvc上传文件,是通过 commons-fileupload.jar、commons-io.jar 实现的,但是对其做了封装,使用起来更简单

Controller方法中,通过 MultipartFile 接口来处理文件上传

修改pom.xml

添加 commons-fileupload、commons-io 依赖:

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.4</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

修改 springMVC.xml

添加上传文件的解析器,该解析器通过 commons-fileupload 解析 mutipart 请求

可以设置上传文件大小

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760" />
    <property name="maxInMemorySize" value="4096" />
    <property name="defaultEncoding" value="utf-8" />
</bean>

解释:

  • maxUploadSize:允许上传最大大小,超过此值会报错

  • maxInMemorySize:阈值,低于此值,只保留在内存里,超过此阈值,生成硬盘上的临时文件

  • defaultEncoding:字符编码的设置,默认是ISO-8859

注意

id 必须是 multipartResolver,否则报错如下:

Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: 由于没有提供multi-part配置,无法处理parts

html

<form method="post" enctype="multipart/form-data" action="student/upload">
    上传图片:<input type="file" name="img"><br>
    描述:<input type="text" name="descrip"><br>
    <input type="submit">
</form>

注意

  • method="post" 必须是 post 方法

  • enctype="multipart/form-data":enctype 是表单请求正文的类型,上传文件必须设置,表示以 流 的方式将数据发送给服务器

  • <input type="file" name="img">:上传文件控件,注意名字

Controller

@PostMapping("/upload")
public String upload(String descrip,MultipartFile img, HttpServletRequest req) {
    System.out.println("描述:"+descrip);
    if (img.isEmpty()){
        return "needUploadFile";
    }
    /*
        ============将上传的文件,保存到 /webapp/upload/ 文件夹下
        1. 获取 /webapp 文件夹路径
        2. 拼装/upload 文件夹
        3. 判断该文件夹是否存在,如果不存在就创建
     */
    String contexPath= req.getSession().getServletContext().getRealPath("/");
    File file=new File(contexPath,"upload");
    if(!file.exists()) {
        file.mkdirs();
    }
    //

    /*
        ============修改文件名,防止上传的文件同名,导致覆盖
     */
    //获取原文件名
    String oFilename=img.getOriginalFilename();
    //截取原文件名得后缀
    String suffix=oFilename.substring(oFilename.lastIndexOf("."));
    //拼装 uuid+原文件名得后缀
    String newFilename= UUID.randomUUID().toString().replace("-","")+suffix;

    File filePath=new File(file,newFilename);

    try {
        img.transferTo(filePath);
    }  catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "uploadSuccess";
}

注意:

  • MultipartFile img:表单上传文件控件的 name 属性,必须与 img 同名

原文出处:/show_1IX75FS9nSh.html