CommonsMultipartResolver 文件上传

欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot

依赖

<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.5</version>
</dependency>

CommonsMultipartResolver配置(spring-mvc.xml)

<!-- 定义文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设定默认编码 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
    <property name="maxUploadSize" value="5242880"></property>
    <!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
    <property name="maxInMemorySize" value="40960"></property>
    <!-- 上传文件的临时路径 -->
    <property name="uploadTempDir" value="fileUpload/temp"></property>
    <!-- 延迟文件解析 -->
    <property name="resolveLazily" value="true"/>
</bean>

前端Jsp

<form action="/upload" method="post" enctype="multipart/form-data">  
    多文件上传注意 file 的 name 值不能重复
    <input type="file" name="file1" />
    <input type="file" name="file2" />
    <input type="submit" value="Submit" />
</form> 

MultipartResolver

MultipartResolver 用于处理文件上传。

当收到请求时,DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。

如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,
然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller

MultipartResolver 是一个接口,它的实现类分为 CommonsMultipartResolver 类和 StandardServletMultipartResolver 类。

MultipartFile 封装了请求数据中的文件,此时这个文件存储在内存中或临时的磁盘文件中,
需要将其转存到一个合适的位置,因为请求结束后临时存储将被清空。

在 MultipartFile 接口中有如下方法:
    String getName();     // 获取参数的名称
    String getOriginalFilename();     // 获取文件的原名称
    String getContentType();     // 文件内容的类型
    boolean isEmpty();     // 文件是否为空
    long getSize();     // 文件大小
    byte[] getBytes();     // 将文件内容以字节数组的形式返回
    InputStream getInputStream();     // 将文件内容以输入流的形式返回
    void transferTo(File dest);     // 将文件内容传输到指定文件中

Controller

    @RequestMapping("/upload")
    public String upload(HttpServletRequest request) throws Exception {

        // 创建一个通用的多部分解析器
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());

        //判断 request 是否有文件上传,即多部分请求  
        if (multipartResolver.isMultipart(request)) {

            //转换成多部分request    
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;

            //取得request中的所有文件名  
            Iterator<String> iter = multiRequest.getFileNames();

            while (iter.hasNext()) {

                //取得上传文件  
                MultipartFile file = multiRequest.getFile(iter.next());

                //对上传文件进行处理  
                if (!file.isEmpty()) {

                    //上传图片至此路径下
                    String path = "D://images//";

                    //获取文件名
                    String fileName = file.getOriginalFilename();

                    File targetFile = new File(path, fileName);
                    if (!targetFile.exists()) {
                        targetFile.mkdirs();
                    }

                    //保存
                    try {
                        file.transferTo(targetFile);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return "success";
    }
posted @ 2019-08-15 20:07  LittleDonkey  阅读(2149)  评论(0编辑  收藏  举报