SpringMVC实现文件的上传与下载

文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考。这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出。最后会把代码 GitHub 地址贴出来,如果有的小伙伴需要完整的配置信息,可以参考。

一、环境准备

1.1在pom.xml中添加对应的依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

1.2在web.xml中配置前端控制器与编码过滤器

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 编码过滤器 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

1.3配置SpringMVC的配置文件spring-mvc.xml

SpringMVC 提供了MultipartResolver来实现文件的上传功能,MultipartResolver是一个接口,实现类有两个:
这里写图片描述
SpringMVC 并没有装配这两个实现类,所以需要我们自动配置,这里以CommonsMultipartResolver为例。

    <!-- 用于自动配置 -->
    <mvc:annotation-driven/>
    <!-- 用于处理静态资源 -->
    <mvc:default-servlet-handler/>

    <!-- 配置 Spring MVC 扫描的包 -->
    <context:component-scan base-package="com.jas.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 配置试图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 配置 CommonsMultipartResolver 的 Bean-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置默认的字符编码 -->
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 设置最大的上传限制,单位是字节 -->
        <property name="maxUploadSize" value="1024000"/>
    </bean>

二、文件上传

分析:图片上传成功后随即跳转到文件下载页面,为了简单的实现功能,上传与下载并没有与数据库交互,可以根据需求将文件上传的路径存在数据库中,显示与下载文件的时候再向数据库中得到文件所在的路径。

2.1编写文件上传相关的JSP

fileupload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<html>
<header>
    <title>文件上传</title>
</header>
<body>
<h2>文件上传</h2>
    <form action="upload" enctype="multipart/form-data" method="post">
        <table>
            <tr>
                <td>文件描述:</td>
                <td><input type="text" name="description"></td>
            </tr>
            <tr>
                <td>请选择文件:</td>
                <td><input type="file" name="file"></td>
            </tr>
            <tr>
                <td><input type="submit" value="上传"></td>
            </tr>
        </table>
    </form>
</body>
</html>

2.2编写后台控制器代码

    @RequestMapping("/upload")
    public String upload(HttpServletRequest request, String description, MultipartFile file) throws Exception {
        if(!file.isEmpty()) {
            // 定义文件上传的路径
            String path = request.getServletContext().getRealPath("/images/");
            // 获得上传文件名
            String fileName = file.getOriginalFilename();
            File filepath = new File(path, fileName);

            // 判断路径是否存在,如果不存在就创建一个
            if (!filepath.getParentFile().exists()) {
                filepath.getParentFile().mkdirs();
            }
            // 将上传文件保存到目标文件中
            file.transferTo(new File(path + File.separator + fileName));
            // 将上传图片描述信息与文件名保存在转发域中,用于下载
           request.setAttribute("description", description);
           request.setAttribute("fileName", fileName);
            return "success";
        } else {
            return "error";
        }
    }

(文件上传完)

2.3上传分析

在上传文件的时候使用了MultipartFile对象,SpringMVC 会将上传的文件绑定在MultipartFile对象中,这个对象提供了一些方法来获得文件的内容,比如:getOriginalFilename()用于获得文件名,transferTo(File dest)用于将上传的文件保存在目的磁盘中。下面是其所提供的方法:
这里写图片描述

三、文件下载

3.1编写文件下载相关的JSP

success.jsp文件上传成功后就会跳转到该页面。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>文件下载</title>
</head>
<body>
    <h2>文件上传成功!点击即可下载上传的文件!</h2>
    <span>${description}</span>
    <a href="download?fileName=${fileName}"> ${fileName}</a>
</body>
</html>

3.2编写后台控制器代码

    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request, String fileName)throws Exception {
        // 获得下载文件路径
        String path = request.getServletContext().getRealPath("/images/");
        // 对中文文件名进行转码
        fileName = new String(fileName.getBytes("iso-8859-1"),"UTF-8");
        File file = new File(path + File.separator + fileName);

        // 文件下载的时候将文件名转码成浏览器可以识别的 ASCII
        String downLoadFileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentDispositionFormData("attachment", downLoadFileName);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                headers, HttpStatus.CREATED);
    }

(文件下载完)

四、测试上传与下载

PS:请忽略 tomcat 的端口号,为了方便我改成了80端口,文件下载直接点击对应的连接即可。
这里写图片描述
不知道有没有小伙伴对上传的路径感到困惑,文件上传成功了,但是在当前工程下并没有保存文件的文件夹,其实是因为项目是通过服务器运行的(这里是 tomcat),上传的文件并没有消失,而是被保存在了服务器发布的项目中。

为了防止出现太多的无效代码,省去了一些类的定义与配置文件的头信息,如果你需要这些信息,可以到 GitHub 中查看。
GitHub 地址:https://github.com/coderjas/spring-notespringmvc-fileupload2download目录下是这个 demo 对应的代码。

参考博文:
https://blog.csdn.net/qian_ch/article/details/69258465

猜你喜欢

转载自blog.csdn.net/codejas/article/details/80077832