• SpringMVC系列(四)之SpringMVC实现文件上传和下载


    目录

    前言

    一. SpringMVC文件上传

    1. 配置多功能视图解析器

    2. 前端代码中,将表单标记为多功能表单

    3. 后端利用MultipartFile 接口,接收前端传递到后台的文件

    4. 文件上传示例

    1. 相关依赖:

     2. 逆向生成对应的类

    3. 后端代码:

    4. 前端代码:

    5. 多文件上传 

    二. SpringMVC文件下载

    三. jrebel的使用

    1. jrebel是什么?

    2. jrebel的安装

    3.jrebel的使用


    前言

    在实际的项目开发中,文件的上传和下载可以说是最常用的功能之一,例如图片的上传与下载、邮件附件的上传和下载等。本篇我们将对 Spring MVC 中的文件上传和文件下载功能进行分享。

    一. SpringMVC文件上传

    在 Spring MVC 中想要实现文件上传工作,需要的步骤如下:

    1. 配置多功能视图解析器

    Spring MVC 提供了一个名为 MultipartResolver 的文件解析器,来实现文件上传功能。MultipartResolver 本身是一个接口,我们需要通过它的实现类来完成对它的实例化工作。

    MultipartResolver 接口共有两个实现类,如下表:

    实现类说明依赖支持的 Servlet 版本
    StandardServletMultipartResolver它是 Servlet 内置的上传功能。不需要第三方 JAR 包的支持。 仅支持 Servlet 3.0 及以上版本
    CommonsMultipartResolver借助 Apache 的 commons-fileupload 来完成具体的上传操作。需要 Apache 的 commons-fileupload 等 JAR 包的支持。不仅支持 Servlet 3.0 及以上版本,还可以在比较旧的 Servlet 版本中使用。

     以上这两个 MultipartResolver 的实现类,无论使用哪一个都可以实现 Spring MVC 的文件上传功能。这里,我以 CommonsMultipartResolver 为例。

    导入pom相关依赖:

    1. commons-fileupload
    2. commons-fileupload
    3. 1.3.3

    想要在 Spring MVC 中使用 CommonsMultipartResolver 对象实现文件上传,我们需要在 Spring MVC 的配置文件中对其进行以下配置:

    1. "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    2. "defaultEncoding" value="UTF-8">
    3. "maxUploadSize" value="52428800">
    4. "resolveLazily" value="true"/>

    通过  可以对 CommonsMultipartResolver 的多个属性进行配置,其中常用的属性如下表。

    属性说明
    defaultEncoding上传文件的默认编码格式。
    maxUploadSize上传文件的最大长度(单位为字节)。
    maxInMemorySize读取文件到内存中的最大字节数。
    resolveLazily判断是否要延迟解析文件。

     注意:当我们在 Spring MVC 的配置文件中对 CommonsMultipartResolver 的 Bean 进行定义时,必须指定这个 Bean 的 id 为 multipartResolver,否则就无法完成文件的解析和上传工作。

    2. 前端代码中,将表单标记为多功能表单

    在 Spring MVC 项目中,大多数的文件上传功能都是通过 form 表单提交到后台服务器的。

    form 表单想要具有文件上传功能,其必须满足以下 3 个条件。

    • form 表单的 method 属性必须设置为 post。
    • form 表单的 enctype 属性设置为 multipart/form-data。
    • 至少提供一个 type 属性为 file 的 input 输入框。

    示例代码如下:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. 图片上传
    3. "${pageContext.request.contextPath }/clazz/upload" method="post" enctype="multipart/form-data">
    4. "text" name="cid" readonly="readonly" value="${param.cid}"/>
    5. "file" name="xxx"/>
    6. "submit" value="上传图片"/>

    当 form 表单的 enctype 属性为 multipart/form-data 时,浏览器会以二进制流的方式对表单数据进行处理,由服务端对文件上传的请求进行解析和处理。

    3. 后端利用MultipartFile 接口,接收前端传递到后台的文件

    controller层:

    1. // 文件上传
    2. @RequestMapping("/upload")
    3. public String upload(clazz clazz,MultipartFile xxx){
    4. try {
    5. // 上传的图片真实存放地址
    6. String dir = PropertiesUtil.getValue("dir");
    7. // 网络访问地址
    8. String server = PropertiesUtil.getValue("server");
    9. String filename = xxx.getOriginalFilename();
    10. System.out.println("文件名:"+filename);
    11. String contentType = xxx.getContentType();
    12. System.out.println("文件类别:"+contentType);
    13. FileUtils.copyInputStreamToFile(xxx.getInputStream(),new File(dir+filename));
    14. // 更新数据库表t_struts_class图片记录
    15. clazz.setPic(server+filename);
    16. clazzBiz.updateByPrimaryKeySelective(clazz);
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. }
    20. return "redirect:clzlist";
    21. }

     在该控制器方法中包含一个 org.springframework.web.multipart.MultipartFile 接口类型的形参,该参数用来封装被上传文件的信息。MultipartFile 接口是 InputStreamSource 的子接口,该接口中提供了多个不同的方法,如下表。

    名称作用
    byte[] getBytes()以字节数组的形式返回文件的内容。
    String getContentType()返回文件的内容类型。
    InputStream getInputStream()返回一个 input 流,从中读取文件的内容。
    String getName()返回请求参数的名称。
    String getOriginalFillename()返回客户端提交的原始文件名称。
    long getSize()返回文件的大小,单位为字节。
    boolean isEmpty()判断被上传文件是否为空。
    void transferTo(File destination)将上传文件保存到目标目录下。

    4. 文件上传示例

    1. 相关依赖:

    web配置如下:

    1. "1.0" encoding="UTF-8"?>
    2. "http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    5. version="3.1">
    6. Archetype Created Web Application
    7. contextConfigLocation
    8. classpath:spring-context.xml
    9. org.springframework.web.context.ContextLoaderListener
    10. encodingFilter
    11. org.springframework.web.filter.CharacterEncodingFilter
    12. true
    13. encoding
    14. UTF-8
    15. encodingFilter
    16. /*
    17. SpringMVC
    18. org.springframework.web.servlet.DispatcherServlet
    19. contextConfigLocation
    20. classpath:spring-mvc.xml
    21. 1
    22. true
    23. SpringMVC
    24. /

     spring-mvc.xml配置文件如下:

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    10. package="com.xissl"/>
    11. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    12. "viewClass"
    13. value="org.springframework.web.servlet.view.JstlView">
    14. "prefix" value="/WEB-INF/jsp/"/>
    15. "suffix" value=".jsp"/>
    16. "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    17. "defaultEncoding" value="UTF-8">
    18. "maxUploadSize" value="52428800">
    19. "resolveLazily" value="true"/>

    数据库配置文件(jdbc.properties):

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=root
    4. jdbc.password=123456

     generatorConfig.xml:

    1. "1.0" encoding="UTF-8" ?>
    2. "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. "jdbc.properties"/>
    5. "D:\\maven\\mvn_repository\\mysql\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    6. "infoGuardian">
    7. "suppressAllComments" value="true"/>
    8. "suppressDate" value="true"/>
    9. "${jdbc.driver}"
    10. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    11. "forceBigDecimals" value="false"/>
    12. "com.xissl.model"
    13. targetProject="src/main/java">
    14. "enableSubPackages" value="false"/>
    15. "constructorBased" value="true"/>
    16. "trimStrings" value="false"/>
    17. "immutable" value="false"/>
    18. "com.xissl.mapper"
    19. targetProject="src/main/java">
    20. "enableSubPackages" value="false"/>
    21. "com.xissl.mapper"
    22. targetProject="src/main/java" type="XMLMAPPER">
    23. "enableSubPackages" value="false"/>
    24. "" tableName="t_struts_class" domainObjectName="clazz"
    25. enableCountByExample="false" enableDeleteByExample="false"
    26. enableSelectByExample="false" enableUpdateByExample="false">

     2. 逆向生成对应的类

    班级实体类(clazz):

    1. package com.xissl.model;
    2. import lombok.ToString;
    3. @ToString
    4. public class clazz {
    5. private Integer cid;
    6. private String cname;
    7. private String cteacher;
    8. private String pic;
    9. public clazz(Integer cid, String cname, String cteacher, String pic) {
    10. this.cid = cid;
    11. this.cname = cname;
    12. this.cteacher = cteacher;
    13. this.pic = pic;
    14. }
    15. public clazz() {
    16. super();
    17. }
    18. public Integer getCid() {
    19. return cid;
    20. }
    21. public void setCid(Integer cid) {
    22. this.cid = cid;
    23. }
    24. public String getCname() {
    25. return cname;
    26. }
    27. public void setCname(String cname) {
    28. this.cname = cname;
    29. }
    30. public String getCteacher() {
    31. return cteacher;
    32. }
    33. public void setCteacher(String cteacher) {
    34. this.cteacher = cteacher;
    35. }
    36. public String getPic() {
    37. return pic;
    38. }
    39. public void setPic(String pic) {
    40. this.pic = pic;
    41. }
    42. }

    mapper接口:

    1. package com.xissl.mapper;
    2. import com.xissl.model.clazz;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. @Repository
    6. public interface clazzMapper {
    7. int deleteByPrimaryKey(Integer cid);
    8. int insert(clazz record);
    9. int insertSelective(clazz record);
    10. clazz selectByPrimaryKey(Integer cid);
    11. int updateByPrimaryKeySelective(clazz record);
    12. int updateByPrimaryKey(clazz record);
    13. List listPager(clazz clazz);
    14. }

     sql映射文件:

    1. "1.0" encoding="UTF-8" ?>
    2. "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. "com.xissl.mapper.clazzMapper" >
    4. "BaseResultMap" type="com.xissl.model.clazz" >
    5. "cid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    6. "cname" jdbcType="VARCHAR" javaType="java.lang.String" />
    7. "cteacher" jdbcType="VARCHAR" javaType="java.lang.String" />
    8. "pic" jdbcType="VARCHAR" javaType="java.lang.String" />
    9. "Base_Column_List" >
    10. cid, cname, cteacher, pic
    11. "deleteByPrimaryKey" parameterType="java.lang.Integer" >
    12. delete from t_struts_class
    13. where cid = #{cid,jdbcType=INTEGER}
    14. "insert" parameterType="com.xissl.model.clazz" >
    15. insert into t_struts_class (cid, cname, cteacher,
    16. pic)
    17. values (#{cid,jdbcType=INTEGER}, #{cname,jdbcType=VARCHAR}, #{cteacher,jdbcType=VARCHAR},
    18. #{pic,jdbcType=VARCHAR})
    19. "insertSelective" parameterType="com.xissl.model.clazz" >
    20. insert into t_struts_class
    21. "(" suffix=")" suffixOverrides="," >
    22. <if test="cid != null" >
    23. cid,
    24. if>
    25. <if test="cname != null" >
    26. cname,
    27. if>
    28. <if test="cteacher != null" >
    29. cteacher,
    30. if>
    31. <if test="pic != null" >
    32. pic,
    33. if>
    34. "values (" suffix=")" suffixOverrides="," >
    35. <if test="cid != null" >
    36. #{cid,jdbcType=INTEGER},
    37. if>
    38. <if test="cname != null" >
    39. #{cname,jdbcType=VARCHAR},
    40. if>
    41. <if test="cteacher != null" >
    42. #{cteacher,jdbcType=VARCHAR},
    43. if>
    44. <if test="pic != null" >
    45. #{pic,jdbcType=VARCHAR},
    46. if>
    47. "updateByPrimaryKeySelective" parameterType="com.xissl.model.clazz" >
    48. update t_struts_class
    49. <if test="cname != null" >
    50. cname = #{cname,jdbcType=VARCHAR},
    51. if>
    52. <if test="cteacher != null" >
    53. cteacher = #{cteacher,jdbcType=VARCHAR},
    54. if>
    55. <if test="pic != null" >
    56. pic = #{pic,jdbcType=VARCHAR},
    57. if>
    58. where cid = #{cid,jdbcType=INTEGER}
    59. "updateByPrimaryKey" parameterType="com.xissl.model.clazz" >
    60. update t_struts_class
    61. set cname = #{cname,jdbcType=VARCHAR},
    62. cteacher = #{cteacher,jdbcType=VARCHAR},
    63. pic = #{pic,jdbcType=VARCHAR}
    64. where cid = #{cid,jdbcType=INTEGER}

    3. 后端代码:

    业务逻辑层:

    1. package com.xissl.biz;
    2. import com.xissl.model.clazz;
    3. import com.xissl.utils.PageBean;
    4. import org.springframework.stereotype.Repository;
    5. import java.util.List;
    6. @Repository
    7. public interface clazzBiz {
    8. int deleteByPrimaryKey(Integer cid);
    9. int insert(clazz record);
    10. int insertSelective(clazz record);
    11. clazz selectByPrimaryKey(Integer cid);
    12. int updateByPrimaryKeySelective(clazz record);
    13. int updateByPrimaryKey(clazz record);
    14. List listPager(clazz clazz, PageBean pageBean);
    15. }

    1. package com.xissl.biz.impl;
    2. import com.xissl.biz.clazzBiz;
    3. import com.xissl.mapper.clazzMapper;
    4. import com.xissl.model.clazz;
    5. import com.xissl.utils.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.util.List;
    9. /**
    10. * @author xissl
    11. * @create 2023-09-11 8:26
    12. */
    13. @Service
    14. public class clazzBizImpl implements clazzBiz {
    15. @Autowired
    16. private clazzMapper clazzMapper;
    17. @Override
    18. public int deleteByPrimaryKey(Integer cid) {
    19. return clazzMapper.deleteByPrimaryKey(cid);
    20. }
    21. @Override
    22. public int insert(clazz record) {
    23. return clazzMapper.insert(record);
    24. }
    25. @Override
    26. public int insertSelective(clazz record) {
    27. return clazzMapper.insertSelective(record);
    28. }
    29. @Override
    30. public clazz selectByPrimaryKey(Integer cid) {
    31. return clazzMapper.selectByPrimaryKey(cid);
    32. }
    33. @Override
    34. public int updateByPrimaryKeySelective(clazz record) {
    35. return clazzMapper.updateByPrimaryKeySelective(record);
    36. }
    37. @Override
    38. public int updateByPrimaryKey(clazz record) {
    39. return clazzMapper.updateByPrimaryKey(record);
    40. }
    41. @Override
    42. public List listPager(clazz clazz, PageBean pageBean) {
    43. return clazzMapper.listPager(clazz);
    44. }
    45. }

     controller层:

    1. package com.xissl.web;
    2. import com.xissl.biz.clazzBiz;
    3. import com.xissl.model.clazz;
    4. import com.xissl.utils.PageBean;
    5. import com.xissl.utils.PropertiesUtil;
    6. import org.apache.commons.io.FileUtils;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.stereotype.Controller;
    9. import org.springframework.ui.Model;
    10. import org.springframework.web.bind.annotation.PathVariable;
    11. import org.springframework.web.bind.annotation.RequestMapping;
    12. import org.springframework.web.multipart.MultipartFile;
    13. import javax.servlet.http.HttpServletRequest;
    14. import java.io.File;
    15. import java.io.IOException;
    16. import java.util.List;
    17. @Controller
    18. @RequestMapping("clazz")
    19. public class clazzController {
    20. @Autowired
    21. private clazzBiz clazzBiz;
    22. // 增
    23. @RequestMapping("/add")
    24. public String add(clazz clazz){
    25. int i = clazzBiz.insertSelective(clazz);
    26. return "redirect:clzlist";
    27. }
    28. // 删
    29. @RequestMapping("/del/{cid}")
    30. public String del(@PathVariable("cid") Integer cid){
    31. clazzBiz.deleteByPrimaryKey(cid);
    32. return "redirect:/clz/clzlist";
    33. }
    34. // 改
    35. @RequestMapping("/edit")
    36. public String edit(clazz clazz){
    37. clazzBiz.updateByPrimaryKey(clazz);
    38. return "redirect:clzlist";
    39. }
    40. // 查
    41. @RequestMapping("/clzlist")
    42. public String list(clazz clazz, HttpServletRequest request){
    43. // clazz clazz是前台用来给后台传递参数的
    44. PageBean pageBean = new PageBean();
    45. pageBean.setRequest(request);
    46. List clzs = clazzBiz.listPager(clazz,pageBean);
    47. request.setAttribute("list",clzs);
    48. request.setAttribute("pageBean",pageBean);
    49. return "clz/clzlist";
    50. }
    51. // 数据回显
    52. @RequestMapping("/preSave")
    53. public String preSave(clazz clazz, Model model){
    54. if(clazz != null && clazz.getCid()!=null && clazz.getCid()!=0){
    55. clazz c = clazzBiz.selectByPrimaryKey(clazz.getCid());
    56. model.addAttribute("c",c);
    57. }
    58. return "clz/clzedit";
    59. }
    60. // 文件上传
    61. @RequestMapping("/upload")
    62. public String upload(clazz clazz,MultipartFile xxx){
    63. try {
    64. // 上传的图片真实存放地址
    65. String dir = PropertiesUtil.getValue("dir");
    66. // 网络访问地址
    67. String server = PropertiesUtil.getValue("server");
    68. String filename = xxx.getOriginalFilename();
    69. System.out.println("文件名:"+filename);
    70. String contentType = xxx.getContentType();
    71. System.out.println("文件类别:"+contentType);
    72. FileUtils.copyInputStreamToFile(xxx.getInputStream(),new File(dir+filename));
    73. // 更新数据库表t_struts_class图片记录
    74. clazz.setPic(server+filename);
    75. clazzBiz.updateByPrimaryKeySelective(clazz);
    76. } catch (IOException e) {
    77. e.printStackTrace();
    78. }
    79. return "redirect:clzlist";
    80. }
    81. }

    工具类PropertiesUtil:

    1. package com.xissl.utils;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.util.Properties;
    5. public class PropertiesUtil {
    6. public static String getValue(String key) throws IOException {
    7. Properties p = new Properties();
    8. InputStream in = PropertiesUtil.class.getResourceAsStream("/resource.properties");
    9. p.load(in);
    10. return p.getProperty(key);
    11. }
    12. }

    配置文件 resource.properties:

    1. dir=D:/temp/upload/
    2. server=/upload/

    PageController(处理页面跳转):

    1. package com.xissl.web;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.PathVariable;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. // 处理页面跳转
    6. @Controller
    7. public class PageController {
    8. @RequestMapping("/page/{page}")
    9. public String toPage(@PathVariable("page") String page){
    10. return page;
    11. }
    12. @RequestMapping("/page/{dir}/{page}")
    13. public String toRePage(@PathVariable("dir") String dir,
    14. @PathVariable("page") String page){
    15. return dir + "/" + page;
    16. }
    17. }

    4. 前端代码:

     clzlist.jsp:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: xissl
    4. Date: 2023/9/9
    5. Time: 14:46
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page language="java" contentType="text/html; charset=UTF-8"
    9. pageEncoding="UTF-8"%>
    10. <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    11. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    12. "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    13. "Content-Type" content="text/html; charset=UTF-8">
    14. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    15. rel="stylesheet">
    16. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js">
    17. 班级列表
    18. "form-inline"
    19. action="${pageContext.request.contextPath }/clazz/clzlist" method="post">
    20. "form-group mb-2">
    21. "text" class="form-control-plaintext" name="sname"
    22. placeholder="请输入班级名称">
    23. <%-- "pagination" value="false" type="hidden">--%>
  • "table table-striped">
  • var="b" items="${list }">
  • "col">班级编号"col">班级名称"col">带班教员"col">班级logo"col">操作
    ${b.cid }${b.cname }${b.cteacher }
  • "${b.pic }" style="height: 50px;width: 40px;">
  • "${pageBean }">
  • clzedit.jsp:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. 编辑界面
    3. "${pageContext.request.contextPath }/${empty c ? 'clazz/add' : 'clazz/edit'}" method="post">
    4. 班级编号:"text" name="cid" value="${s.cid }">
    5. 班级名称:"text" name="cname" value="${s.cname }">
    6. 带班教员:"text" name="cteacher" value="${s.cteacher }">
    7. 班级logo:"text" name="pic" value="${s.pic }">
    8. "submit">

    upload.jsp:
     

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. 图片上传
    3. "${pageContext.request.contextPath }/clazz/upload" method="post" enctype="multipart/form-data">
    4. "text" name="cid" readonly="readonly" value="${param.cid}"/>
    5. "file" name="xxx"/>
    6. "submit" value="上传图片"/>

    5. 示例效果:

     

    5. 多文件上传 

    标签中增加一个 multiple 属性。该属性可以让我们同时选择对多个文件进行上传,即实现多文件上传功能。 

    1. //多文件上传
    2. @RequestMapping("/uploads")
    3. public String uploads(HttpServletRequest req, clazz clazz, MultipartFile[] files){
    4. try {
    5. StringBuffer sb = new StringBuffer();
    6. for (MultipartFile cfile : files) {
    7. //思路:
    8. //1) 将上传图片保存到服务器中的指定位置
    9. String dir = PropertiesUtil.getValue("dir");
    10. String server = PropertiesUtil.getValue("server");
    11. String filename = cfile.getOriginalFilename();
    12. FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
    13. sb.append(filename).append(",");
    14. }
    15. System.out.println(sb.toString());
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. }
    19. return "redirect:list";
    20. }

    二. SpringMVC文件下载

     文件下载的含义十分简单,它指的就是将服务器中的文件下载到本机上。

    controller层:

    1. @RequestMapping(value="/download")
    2. public ResponseEntity<byte[]> download(clazz clazz, HttpServletRequest req){
    3. try {
    4. //先根据文件id查询对应图片信息
    5. clazz clz = this.clazzBiz.selectByPrimaryKey(clazz.getCid());
    6. String diskPath = PropertiesUtil.getValue("dir");
    7. String reqPath = PropertiesUtil.getValue("server");
    8. String realPath = clz.getPic().replace(reqPath,diskPath);
    9. String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
    10. //下载关键代码
    11. File file=new File(realPath);
    12. HttpHeaders headers = new HttpHeaders();//http头信息
    13. String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
    14. headers.setContentDispositionFormData("attachment", downloadFileName);
    15. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    16. //MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
    17. return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
    18. }catch (Exception e){
    19. e.printStackTrace();
    20. }
    21. return null;
    22. }

    三. jrebel的使用

    1. jrebel是什么?

    JRebel 是国外团队开发的一款收费工具,JRebel 允许开发团队在有限的时间内完成更多的任务修正更多的问题,发布更高质量的软件产品,JRebel 可快速实现热部署,节省了大量重启时间,提高了个人开发效率。
    JRebel 是一款 JAVA 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    2. jrebel的安装

    打开IDEA,选择File—>Settings—>Plugins—>在右侧选择Marketplace
    在搜索框输入jrebel—>选择搜索结果—>点击Install(安装),如下图。

    3.jrebel的使用

    下载激活软件github github地址

    1.下载后双击运行该程序ReverseProxy_windows_amd64.exe(window 64位系统)

    2. jrebel启动项目

    注意:一定要先打开代理ReverseProxy_windows_amd64.exe,再启动jrebel

    启动就jrebel后,会弹出一个提示框让你进行激活,点击激活即可。

    激活地址填写:http://127.0.0.1:8888 后面再拼接一个GUID

    在线GUID地址

    然后点击Activate JRebel就可以激活了

    激活成功后点击Work online切换到离线状态

  • 相关阅读:
    idea中导入eclipse项目后没显示src文件
    Java中JRE指什么呢?
    10.4 认识Capstone反汇编引擎
    SpringBoot【SpringBoot指标监控、SpringBoot日志管理、SpringBoot项目部署、 SpringBoot容器化部署】(五)-全面详解(学习总结---从入门到深化)
    【华为OD机试真题 python】 水仙花数【2022 Q4 | 100分】
    .[nicetomeetyou@onionmail.org].faust深入剖析勒索病毒及防范策略
    软件设计模式系列之二十二——状态模式
    Skywalking流程分析_2(配置加载和自定义类加载器初始化)
    vue.runtime.esm.js?c320:4625 [Vue warn]: Failed to resolve directive: lazy
    Gulp工具
  • 原文地址:https://blog.csdn.net/lijie1025/article/details/132775220