乐趣区

关于spring-mvc:传统JavaWeb的文件上传和SpringMVC提供额的文件上传

传统 JavaWeb 的文件上传
1. 前提

1.1form 表单的 enctype 取值必须是:multipart/form-data(用分隔符将表单分为几个局部,其中有表单元素的名称,也有你抉择的文件)(默认值是:application/x-www-form-urlencoded,它设置了将表单数据以键值对的模式上传)
   enctype: 是表单申请注释的类型
1.2 method 属性取值必须是 Post
1.3 提供一个文件抉择域 <input type=”file”/>

2. 文件上传原理
当 form 表单的 enctype 取值不是默认值后,request.getParameter()将生效。enctype=”application/x-www-form-urlencoded”时,form 表单的注释内容是:
key=value&key=value&key=value
当 form 表单的 enctype 取值为 Mutilpart/form-data 时,申请注释内容就变成:
每一部分都是 MIME 类型形容的注释
—————————–7de1a433602ac 分界符
Content-Disposition: form-data; name=”userName” 协定头
aaa 协定的注释
—————————–7de1a433602ac
Content-Disposition: form-data; name=”file”;
filename=”C:\Users\zhy\Desktop\fileupload_demofile\b.txt”
Content-Type: text/plain 协定的类型(MIME 类型)
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
—————————–7de1a433602ac–

这时须要先解析表单传输的数据体,找到表单上传的文件的局部,能力进行上传。
借助 jar 包能够不便解析

3.借助第三方组件实现文件上传
应用 Commons-fileupload 组件实现文件上传,须要导入该组件相应的撑持 jar 包:Commons-fileupload 和 commons-io。commons-io 不属于文件上传组件的开发 jar 文件,但 Commons-fileupload 组件从 1.1 版本开始,它工作时须要 commons-io 包的反对

导入依赖

      <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>

SpringMVC 的文件上传

与传统文件上传的区别在于,SpringMVC 框架可能代替咱们去解析 request,拿到须要上传的文件。为应用该性能只须要引入 SpringMVC 曾经创立好的一个用于解析 request 的类:CommonsMultipartResolver

1. 编写用于上传文件的 jsp 页面

    <h3>SpringMVC 形式上传 </h3>
    <form name="upload" action="work/upload2" method="post" enctype="multipart/form-data">
        抉择文件:<input type="file" name="upload"/><br>
        <input type="submit" value="上传"/>
    </form>

2. 在 springmvc.xml 中配置 CommonsMultipartResolver:

    <!--id 名必须是 multipartResolver-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>  <!-- 规定上传文件的大小,单位是字节,10M=10*1024*1024=10485760-->
    </bean>

3. 编写 Controller 办法

    @RequestMapping("/upload2")
    public String upload2(HttpServletRequest request, MultipartFile upload) throws IOException {  /*MultipartFile 创立的对象的名字必须和上传文件页面抉择文件的组件名雷同 */
        //1. 拿到上传文件的文件夹地址
        String path=request.getSession().getServletContext().getRealPath("/uploads/");
        // 判断该文件夹是否存在,如果不存在,创立新的文件夹
        File file=new File(path);
        if(!file.exists()){file.mkdirs();
        }
        //upload 是解析完 request 后失去的须要上传的文件, 上传该文件
        String fileName=UUID.randomUUID().toString().replace("-","")+"_"+upload.getOriginalFilename();
        upload.transferTo(new File(path,fileName));
        return "success";
    }

留神的中央:
1. 引入解析 request 的 CommonsMultipartResolver 类时,id 名必须是 multipartResolver
2. 通过参数绑定机制拿到解析后的上传文件,须要在 Controller 办法的参数中增加 MultipartFile 的一个实例,且名字必须和 jsp 页面的上传文件的组件名雷同
3. 在 Controller 办法办法中获取上传文件的名称的办法是 upload.getOriginalFilename() 而不是 upload.getName();

SpringMVC 的跨服务器文件上传

退出移动版