• SpringMVC文件的上传下载&JRebel的使用


    目录

    前言        

    一、JRebel的使用

    1.IDea内安装插件

    2.激活

    3.离线使用

    使用JRebel的优势

    二、文件上传与下载

     1 .导入pom依赖

    2.配置文件上传解析器

    3.数据表

    4.配置文件

    5.前端jsp页面

    6.controller层

    7.测试结果


    前言        

            当涉及到Web应用程序的开发时,文件上传和下载是非常常见的功能。在SpringMVC框架中,我们可以很方便地实现这些功能。同时,我们还可以使用JRebel来提高开发效率。本文将介绍如何在SpringMVC中实现文件上传和下载,并提供JRebel的下载和使用方法。

    一、JRebel的使用

            JRebel通过在运行时重新加载修改后的类文件,实现了热部署的功能。它能够监测到代码的变化,并将变化应用到正在运行的应用程序中,从而避免了重新编译和部署的过程。

    1.IDea内安装插件

    File➡Settings➡plugins➡搜索jrebel

    下载后需重启idea才可使用

    2.激活

    下载服务,进入GitHub网址Release v1.4 · ilanyu/ReverseProxy · GitHub

     

    双击进入服务

    打开服务后,在激活完成前不要关闭

    开始激活

     

    Team URL第一行:

     http://127.0.0.1:8080/GUID

    将GUID替换为GUID online erstellen将GUID替换为将GUID替换为GUID online erstellen所生成的GUID链接

    第二行填入电子邮箱即可

     然后将最下面的勾选上并点击Active JRebel进行激活

    这样就激活成功啦!!

    3.离线使用

    File➡Settings➡JRebel➡Work office

    这样就完成啦,将服务关闭也可继续使用!

    使用JRebel的优势

    1. 提高开发效率:传统的Java开发需要每次修改代码后重新编译和部署应用程序,这样会浪费大量的时间。而使用JRebel,你可以立即看到代码的变化效果,无需重启应用程序,大大提高了开发效率。

    2. 快速调试和测试:JRebel可以实时加载修改后的代码,使得你可以立即进行调试和测试。你可以在不中断应用程序运行的情况下,快速定位和修复问题,提高调试效率。

    3. 减少开发周期:由于不需要重启应用程序,使用JRebel可以减少开发周期。你可以更快地完成功能开发和调试,提前交付产品。

    4. 提高开发体验:JRebel可以让你专注于代码编写,而不需要频繁地重启应用程序。这样可以提高开发的流畅性和舒适度,让你更加享受编码的过程。

    5. 支持多种框架和服务器:JRebel支持多种Java框架和服务器,包括Spring、Hibernate、Tomcat等。无论你使用哪种框架和服务器,都可以享受到JRebel带来的好处。

    二、文件上传与下载

     1 .导入pom依赖

    添加文件上传依赖

    1. <commons-fileupload.version>1.3.3</commons-fileupload.version>
    2. <dependency>
    3. <groupId>commons-fileupload</groupId>
    4. <artifactId>commons-fileupload</artifactId>
    5. <version>${commons-fileupload.version}</version>
    6. </dependency>

    2.配置文件上传解析器

    配置了一个名为"multipartResolver"的Bean,用于处理文件上传。通过设置"defaultEncoding"属性、"maxUploadSize"属性和"resolveLazily"属性,可以指定文件上传时的字符编码、最大上传大小和延迟文件解析的行为。这样,Spring框架在处理文件上传时会根据这些配置进行相应的解析和限制。

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

    3.数据表

    配置表信息,并生成代码

    generatorConfig.xml :

    1. <table schema="" tableName="t_user_head" domainObjectName="User"
    2. enableCountByExample="false" enableDeleteByExample="false"
    3. enableSelectByExample="false" enableUpdateByExample="false">
    4. </table>

    4.配置文件

    配置文件上传下载路径信息

    resource.properties:

    1. #本地路径
    2. dir=D:/temp/upload/
    3. #服务器路径
    4. server=/upload/

    编写读取配置文件的工具类

    1. package com.ctb.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. }

    配置文件映射路径

    5.前端jsp页面

    首页

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@include file="/common/header.jsp"%>
    4. <!DOCTYPE html>
    5. <html>
    6. <head>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <title>用户列表</title>
    9. </head>
    10. <body>
    11. <form class="form-inline"
    12. action="/user/list" method="post">
    13. <div class="form-group mb-2">
    14. <input type="text" class="form-control-plaintext" name="uname"
    15. placeholder="请输入用户名称">
    16. </div>
    17. <button type="submit" class="btn btn-primary mb-2">查询</button>
    18. <a class="btn btn-primary mb-2" href="/user/detail">新增</a>
    19. </form>
    20. <table class="table table-striped">
    21. <thead>
    22. <tr>
    23. <th scope="col">用户编号</th>
    24. <th scope="col">用户名称</th>
    25. <th scope="col">用户头像</th>
    26. <th scope="col">操作</th>
    27. </tr>
    28. </thead>
    29. <tbody>
    30. <c:forEach var="b" items="${lst }">
    31. <tr>
    32. <td>${b.id }</td>
    33. <td>${b.uname }</td>
    34. <td>
    35. <img src="${b.upic }" style="height: 100px" width="60px">
    36. </td>
    37. <td>
    38. <a href="/user/detail?id=${b.id}">修改</a>
    39. <a href="/user/del/${b.id}">删除</a>
    40. <a href="/page/user/upload?id=${b.id}">文件上传</a>
    41. <a href="/user/download?id=${b.id}">文件下载</a>
    42. </td>
    43. </tr>
    44. </c:forEach>
    45. </tbody>
    46. </table>
    47. <!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
    48. <z:page pageBean="${pageBean }"></z:page>
    49. </body>
    50. </html>

    文件上传表单

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 86155
    4. Date: 2023/9/9
    5. Time: 15:52
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>头像上传</title>
    12. </head>
    13. <body>
    14. <form action="/user/upload" method="post" enctype="multipart/form-data">
    15. <label>用户编号:</label><input type="text" name="id" readonly="readonly" value="${param.id}"/><br/>
    16. <label>用户头像:</label><input type="file" name="uu"/><br/>
    17. <input type="submit" value="上传图片"/>
    18. </form>
    19. <%--多文件上传--%>
    20. <form method="post" action="/user/uploads" enctype="multipart/form-data">
    21. <input type="file" name="files" multiple>
    22. <button type="submit">上传</button>
    23. </form>
    24. </body>
    25. </html>

    6.controller层

    1. package com.ctb.controller;
    2. import com.ctb.biz.UserBiz;
    3. import com.ctb.model.User;
    4. import com.ctb.utils.PageBean;
    5. import com.ctb.utils.PropertiesUtil;
    6. import org.apache.commons.io.FileUtils;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.http.HttpHeaders;
    9. import org.springframework.http.HttpStatus;
    10. import org.springframework.http.MediaType;
    11. import org.springframework.http.ResponseEntity;
    12. import org.springframework.stereotype.Controller;
    13. import org.springframework.ui.Model;
    14. import org.springframework.web.bind.annotation.PathVariable;
    15. import org.springframework.web.bind.annotation.RequestMapping;
    16. import org.springframework.web.multipart.MultipartFile;
    17. import javax.servlet.http.HttpServletRequest;
    18. import java.io.File;
    19. import java.io.IOException;
    20. import java.util.List;
    21. @Controller
    22. @RequestMapping("/user")
    23. public class UserController {
    24. @Autowired
    25. private UserBiz userBiz;
    26. //
    27. @RequestMapping("/add")
    28. public String add(User user){
    29. int i = userBiz.insertSelective(user);
    30. return "redirect:list";
    31. }
    32. //
    33. @RequestMapping("/del/{id}")
    34. public String del(@PathVariable("id") Integer id){
    35. userBiz.deleteByPrimaryKey(id);
    36. return "redirect:/user/list";
    37. }
    38. //
    39. @RequestMapping("/edit")
    40. public String edit(User user){
    41. userBiz.updateByPrimaryKeySelective(user);
    42. return "redirect:list";
    43. }
    44. @RequestMapping("/upload")
    45. public String upload(User user,MultipartFile uu){
    46. try {
    47. //上传图片本地路径
    48. String dir= PropertiesUtil.getValue("dir");
    49. //网络访问地址
    50. String server=PropertiesUtil.getValue("server");
    51. //文件名
    52. String filename = uu.getOriginalFilename();
    53. //文件类别
    54. // String type = uu.getContentType();
    55. FileUtils.copyInputStreamToFile(uu.getInputStream(),new File(dir+filename));
    56. user.setUpic(server+filename);
    57. userBiz.updateByPrimaryKeySelective(user);
    58. } catch (IOException e) {
    59. e.printStackTrace();
    60. }
    61. return "redirect:list";
    62. }
    63. //多文件下载
    64. @RequestMapping("/uploads")
    65. public String uploads(HttpServletRequest req, User user, MultipartFile[] files){
    66. try {
    67. StringBuffer sb = new StringBuffer();
    68. for (MultipartFile cfile : files) {
    69. //思路:
    70. //1) 将上传图片保存到服务器中的指定位置
    71. String dir = PropertiesUtil.getValue("dir");
    72. String server = PropertiesUtil.getValue("server");
    73. String filename = cfile.getOriginalFilename();
    74. FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
    75. sb.append(filename).append(",");
    76. }
    77. System.out.println(sb.toString());
    78. } catch (Exception e) {
    79. e.printStackTrace();
    80. }
    81. return "redirect:list";
    82. }
    83. //
    84. @RequestMapping("/list")
    85. public String list(User user, HttpServletRequest request){
    86. PageBean pageBean = new PageBean();
    87. pageBean.setRequest(request);
    88. List<User> Users = userBiz.listPager(user, pageBean);
    89. request.setAttribute("lst",Users);
    90. request.setAttribute("pageBean",pageBean);
    91. return "user/list";
    92. }
    93. // 查询单个
    94. @RequestMapping("/detail")
    95. public String preSave(User user, Model model){
    96. if(user != null && user.getId() != null && user.getId() != 0){
    97. User u = userBiz.selectByPrimaryKey(user.getId());
    98. model.addAttribute("b",u);
    99. }
    100. return "user/edit";
    101. }
    102. @RequestMapping(value="/download")
    103. public ResponseEntity<byte[]> download(User user,HttpServletRequest req){
    104. try {
    105. //先根据文件id查询对应图片信息
    106. User u = this.userBiz.selectByPrimaryKey(user.getId());
    107. String diskPath = PropertiesUtil.getValue("dir");
    108. String reqPath = PropertiesUtil.getValue("server");
    109. System.out.println(diskPath);
    110. String realPath = u.getUpic().replace(reqPath,diskPath);
    111. String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
    112. //下载关键代码
    113. File file=new File(realPath);
    114. HttpHeaders headers = new HttpHeaders();//http头信息
    115. String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
    116. headers.setContentDispositionFormData("attachment", downloadFileName);
    117. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    118. //MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
    119. return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
    120. }catch (Exception e){
    121. e.printStackTrace();
    122. }
    123. return null;
    124. }
    125. }

    7.测试结果

    文件上传

    文件下载

    多文件上传

  • 相关阅读:
    [附源码]计算机毕业设计JAVA高校贫困生认定系统
    java毕业设计选题基于SSM毕业设计管理系统|毕设管理文档成绩Shiro
    C# 通过回调获取多线程中的结果
    提示工程 vs 微调 vs RAG
    杭电oj 2037 今年暑假不AC C语言
    亚马逊气候友好型承诺所有认证
    Java基础-对象序列化
    “知了杯”网络安全竞赛宜宾、南充赛区开赛,十余所院校现场角逐
    在互联网,摸爬滚打了几年,我悟了。面对如今经济形势,普通打工人如何应对?
    Photoshop制作白色可爱音乐播放图标面板
  • 原文地址:https://blog.csdn.net/weixin_74268571/article/details/132801863