SpringMVC实现文件上传与下载

本文实例为大家分享了SpringMVC实现文件上传与下载的具体代码,供大家参考,具体内容如下

0.环境准备

1.maven依赖

<dependencies>    <dependency>      <groupId>org.junit.jupiter</groupId>      <artifactId>junit-jupiter-api</artifactId>      <version>5.7.0</version>      <scope>test</scope>    </dependency>    <!-- servlet依赖 -->    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>javax.servlet-api</artifactId>      <version>3.1.0</version>      <scope>provided</scope>    </dependency>    <!-- springMVC依赖 -->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-webmvc</artifactId>      <version>5.2.6.RELEASE</version>    </dependency>    <!-- 文件上传的jar包 -->    <dependency>      <groupId>commons-io</groupId>      <artifactId>commons-io</artifactId>      <version>2.8.0</version>    </dependency>    <dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.3.3</version></dependency>

2.springConfig。xml配置文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/context       https://www.springframework.org/schema/context/spring-context.xsd       http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">    <!-- 开启组件扫描   -->    <context:component-scan base-package="com.compass.file"></context:component-scan>    <!--声明 配置springMVC视图解析器-->    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <!--前缀:视图文件的路径-->        <property name="prefix" value="/WEB-INF/view/" />        <!--后缀:视图文件的扩展名-->        <property name="suffix" value=".jsp" />    </bean>    <!--读写JSON的支持(Jackson)-->    <mvc:annotation-driven /><!--  配置多媒体解析  -->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--  配置字符编码集 -->        <property name="defaultEncoding" value="utf-8"> </property><!-- 配置文件上传大小 单位是字节    -1代表没有限制 maxUploadSizePerFile是限制每个上传文件的大小,而maxUploadSize是限制总的上传文件大小  -->        <property name="maxUploadSizePerFile" value="-1"> </property> <!-- ,不设置默认不限制总的上传文件大小,这里设置总的上传文件大小不超过1M(1*1024*1024) -->        <property name="maxUploadSize" value="1048576"/>    </bean></beans>

3.web.xml配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"         version="4.0">  <!-- 声明springMvc的核心对象 DispatcherServlet -->  <servlet>    <servlet-name>web</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:springConfig.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>web</servlet-name>    <url-pattern>*.mvc</url-pattern>  </servlet-mapping>  <!--  注册字符集过滤器,解决post请求的中文乱码问题-->  <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>    <init-param>      <param-name>forRequestEncoding</param-name>      <param-value>true</param-value>    </init-param>    <init-param>      <param-name>forResponseEncoding</param-name>      <param-value>true</param-value>    </init-param>  </filter>  <filter-mapping>    <filter-name>characterEncodingFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping></web-app>

1.文件上传

文件上传分为三种方式:

单个文件单字段 多个文件单字段 多个文件多字段

注意点:

1、提交方式为表单的post请求2、from属性中必须有enctype=“multipart/form-data”3、如果是单字段多文件:输入框中的属性必须为:multiple=“multiple”4、表单中的属性name必须和后端参数一致

1.前端代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>文件上传</title></head><body><div>    <p style="text-align: center">文件上传(单个文件单字段上传)</p>    <form action="${pageContext.request.contextPath}/uploadFile1.mvc" method="post"  enctype="multipart/form-data">        <input type="file" name="file">        <input type="submit" value="提交">    </form></div><div>    <p style="text-align: center">文件上传(多文件单字段上传)</p>    <form action="${pageContext.request.contextPath}/uploadFile2.mvc" method="post"  enctype="multipart/form-data">        <input type="file" name="file" multiple="multiple">        <input type="submit" value="提交">    </form></div><div>    <p style="text-align: center">文件上传(多文件多字段上传)</p>    <form action="${pageContext.request.contextPath}/uploadFile2.mvc" method="post"  enctype="multipart/form-data">        <input type="file" name="file" >        <input type="file" name="file" >        <input type="submit" value="提交">    </form></div></body></html>

2.后端代码

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpSession;import java.io.File;import java.io.IOException;/** * @author compass * @version 1.0 * @date 2021-05-11 14:33 */@Controllerpublic class UploadIFileController {    // 处理单个文件上传    @PostMapping("/uploadFile1.mvc")     public ModelAndView uploadFile1(MultipartFile file, HttpSession session) throws IOException {        ModelAndView view = new ModelAndView();        // 得到文件名称        String filename=file.getOriginalFilename();        System.out.println("文件名称:"+filename);        if (!file.isEmpty()){            // 判断文件的后缀            if (filename.endsWith(".jpg")||filename.endsWith(".png")||filename.endsWith(".txt"));            //设置文件的保存路径            String savePath="C:\\Users\\14823\\IdeaProjects\\springMVC\\fileupload\\src\\main\\webapp\\WEB-INF\\file";            File srcFile = new File(savePath,filename);            // 执行文件保存操作            file.transferTo(srcFile);            view.setViewName("forward:/uploadSuccess.jsp");        }else {            view.setViewName("forward:/uploadFailed.jsp");        }        return view;    }    // 处理多文件上传    @PostMapping("/uploadFile2.mvc")    public ModelAndView uploadFile2(MultipartFile[] file,HttpSession session) throws IOException {        ModelAndView view = new ModelAndView();        //设置文件的保存路径        String savePath="C:\\Users\\14823\\IdeaProjects\\springMVC\\fileupload\\src\\main\\webapp\\WEB-INF\\file";        String[] filenames = new String[file.length];        // 只要上传过来的文件为空或者是不符合指定类型的都会上传失败        for (int i = 0; i <filenames.length ; i++) {            // 判断上传过来的文件是否为空            if (!file[i].isEmpty()){               String filename=file[i].getOriginalFilename();               // 判断文件类型               if (filename.endsWith(".txt")||filename.endsWith(".jpg")||filename.endsWith(".png")){                   // 创建一个文件对象                   File srcFile = new File(savePath, filename);                   // 执行保存文件操作                   file[i].transferTo(srcFile);                   view.setViewName("forward:/uploadSuccess.jsp");               }else {                   view.setViewName("forward:/uploadSuccess.jsp");               }            }else {                view.setViewName("forward:/uploadFailed.jsp");            }        }        return view;    }}

2.文件下载

文件下分为两种情况:

文件名称是纯英文字母的 文件名带有中文不处理会乱码的

1.前端代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>文件下载</title></head><body><h1 style="text-align: center"><a href="${pageContext.request.contextPath}/download1.mvc?filename=preview.jpg" rel="external nofollow" >文件下载(非中文名称)</a></h1><h1 style="text-align: center"><a href="${pageContext.request.contextPath}/download2.mvc?filename=文件下载.txt" rel="external nofollow" >文件下载(中文名称)</a></h1></body></html>

2.后端代码

/** * @author compass * @version 1.0 * @date 2021-05-11 15:23 */@Controllerpublic class DownloadController {    // 非中文名称文件下载    @GetMapping("/download1.mvc")    public ResponseEntity <byte[]> fileDownload1(String filename,HttpServletRequest request) throws IOException {        String path="C:\\Users\\14823\\IdeaProjects\\springMVC\\fileupload\\src\\main\\webapp\\WEB-INF\\file\\";        File file = new File(path,filename);        HttpHeaders header = new HttpHeaders();        header.setContentDispositionFormData("attachment",filename);        header.setContentType(MediaType.APPLICATION_OCTET_STREAM);        ResponseEntity<byte[]> result = new ResponseEntity<>(FileUtils.readFileToByteArray(file), header, HttpStatus.OK);        return result;    }    // 中文名称文件下载    @GetMapping("/download2.mvc")    public ResponseEntity <byte[]> fileDownload2(String filename,HttpServletRequest request) throws IOException {        System.out.println(filename);        String path="C:\\Users\\14823\\IdeaProjects\\springMVC\\fileupload\\src\\main\\webapp\\WEB-INF\\file\\";        filename = filename.replace("_", "%");        filename= URLDecoder.decode(filename,"UTF-8");        String downloadFile="";        if (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie")>0){            filename= URLEncoder.encode(filename,"UTF-8");            downloadFile=filename.replaceAll("+","%20");        }else {            downloadFile=new String(filename.getBytes("UTF-8"),"ISO-8859-1");        }        File file = new File(path,filename);        HttpHeaders header = new HttpHeaders();        header.setContentDispositionFormData("attachment",downloadFile);        header.setContentType(MediaType.APPLICATION_OCTET_STREAM);        ResponseEntity<byte[]> result = new ResponseEntity<>(FileUtils.readFileToByteArray(file), header, HttpStatus.OK);        return result;    }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

耿耿于怀着过去和忐忑不安着未来的人,也常常挥霍无度着现在。

SpringMVC实现文件上传与下载

相关文章:

你感兴趣的文章:

标签云: