• SpringMVC之文件上传下载以及jrebel的使用


    目录

    前言

    文件上传

    导入依赖

    配置文件上传解析器

    配置存放地址 

    ​编辑 导入PropertiesUtil工具类

     编写resource.properties

    添加sql 

    编写PageController类

     编写主页展示界面

      编写文件上传方法

     搭建一个图片上传的操作页面 

    文件下载

     多文件上传

     效果展示​编辑

    jrebel的使用

    jerbel的安装 

    设置jrebel离线 


    前言

    继上篇博客

    文件上传

    由于我们在上篇已经生成了带图片属性的接口、实体以及配置文件。所以我们就不需要重新逆向生成mapper和model包中的代码了

    导入依赖

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

    配置文件上传解析器

    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>

    配置存放地址 

     

     导入PropertiesUtil工具类

    1. package com.xiaoxu.utis;
    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:/temp2/upload/
    2. server=/upload/

    添加sql 

    1. <select id="selectPage" resultType="com.xiaoxu.model.Bookxx" parameterType="com.xiaoxu.model.Bookxx" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_hibernate_book
    5. <where>
    6. <if test="book_name != null">
    7. and book_name like concat('%',#{book_name},'%')
    8. </if>
    9. </where>
    10. </select>

    编写PageController类

    1. package com.xiaoxu.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. * @author小徐
    7. * @site www.veryedu.cn
    8. * @company xu集团
    9. * @create 2023-09-07 17:27
    10. *
    11. * 用来处理页面跳转
    12. */
    13. @Controller
    14. public class PageController {
    15. @RequestMapping("/page/{page}")
    16. public String toPage(@PathVariable("page") String page){
    17. return page;
    18. }
    19. @RequestMapping("/page/{dir}/{page}")
    20. public String toDirPage(@PathVariable("dir") String dir,
    21. @PathVariable("page") String page){
    22. return dir + "/" + page;
    23. }
    24. }

     编写主页展示界面

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    6. <html>
    7. <head>
    8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    9. <link
    10. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    11. rel="stylesheet">
    12. <script
    13. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
    14. <title>博客列表</title>
    15. <style type="text/css">
    16. .page-item input {
    17. padding: 0;
    18. width: 40px;
    19. height: 100%;
    20. text-align: center;
    21. margin: 0 6px;
    22. }
    23. .page-item input, .page-item b {
    24. line-height: 38px;
    25. float: left;
    26. font-weight: 400;
    27. }
    28. .page-item.go-input {
    29. margin: 0 10px;
    30. }
    31. </style>
    32. </head>
    33. <body>
    34. <form class="form-inline"
    35. action="${pageContext.request.contextPath }/clz/list" method="post">
    36. <div class="form-group mb-2">
    37. <input type="text" class="form-control-plaintext" name="book_name"
    38. placeholder="请输入书籍名称">
    39. <!-- <input name="rows" value="20" type="hidden"> -->
    40. <!-- 不想分页 -->
    41. </div>
    42. <button type="submit" class="btn btn-primary mb-2">查询</button>
    43. <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/clz/preSave">新增</a>
    44. </form>
    45. <table class="table table-striped ">
    46. <thead>
    47. <tr>
    48. <th scope="col">书籍编号</th>
    49. <th scope="col">书籍图片</th>
    50. <th scope="col">价格</th>
    51. <th scope="col">image</th>
    52. <th scope="col">操作</th>
    53. </tr>
    54. </thead>
    55. <tbody>
    56. <c:forEach var="b" items="${list }">
    57. <tr>
    58. <td>${b.book_id }</td>
    59. <td>${b.book_name }</td>
    60. <td>${b.price }</td>
    61. <td>
    62. <img src="${b.image}" style="height: 100px;width: 60px">
    63. </td>
    64. <td>
    65. <a href="${pageContext.request.contextPath }/clz/preSave?book_id=${b.book_id}">修改</a>
    66. <a href="${pageContext.request.contextPath }/clz/del/${b.book_id}">删除</a>
    67. <a href="${pageContext.request.contextPath }/page/clz/upload?book_id=${b.book_id}">图片上传</a>
    68. <a href="${pageContext.request.contextPath }/clz/download?book_id=${b.book_id}">图片下载</a>
    69. </td>
    70. </tr>
    71. </c:forEach>
    72. </tbody>
    73. </table>
    74. <!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
    75. <z:page pageBean="${pageBean }"></z:page>
    76. ${pageBean }
    77. </body>
    78. </html>

      编写文件上传方法

    1. // 文件上传
    2. @RequestMapping("/upload")
    3. public String upload(Bookxx bookxx ,MultipartFile xxx){
    4. try {
    5. // 上传图片真实存放地址
    6. String dir = PropertiesUtil.getValue("dir");
    7. // 网络访问地址
    8. String server = PropertiesUtil.getValue("server");
    9. String filename = xxx.getOriginalFilename();FileUtils.copyInputStreamToFile(xxx.getInputStream(),new File(dir+filename));
    10. //保存
    11. bookxx.setImage(server+filename);
    12. bookxxBiz.updateByPrimaryKeySelective(bookxx);
    13. } catch (Exception e) {
    14. e.printStackTrace();
    15. }
    16. return "redirect:list";
    17. }

     搭建一个图片上传的操作页面 

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 86155
    4. Date: 2023/9/9
    5. Time: 14:55
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>w
    9. <html>
    10. <head>
    11. <title>书籍logo上传</title>
    12. </head>
    13. <body>
    14. <form action="${pageContext.request.contextPath }/clz/upload" method="post" enctype="multipart/form-data">
    15. <label>书籍编号:</label><input type="text" name="book_id" readonly="readonly" value="${param.book_id}"/><br/>
    16. <label>书籍图片:</label><input type="file" name="xxx"/><br/>
    17. <input type="submit" value="上传图片"/>
    18. </body>
    19. </html>

    文件下载

    在Controller层中加入以下代码,如下:

    1. @RequestMapping("/download")
    2. public ResponseEntity<byte[]> download(Bookxx bookxx,HttpServletRequest req){
    3. try {
    4. //先根据文件id查询对应图片信息
    5. Bookxx bookxx1 = this.bookxxBiz.selectByPrimaryKey(bookxx.getBook_id());
    6. String diskPath = PropertiesUtil.getValue("dir");
    7. String reqPath = PropertiesUtil.getValue("server");
    8. String realPath = bookxx1.getImage().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. }

     多文件上传

    多文件上传跟单文件上传的区别

    多文件上传和单文件上传的区别在于,多文件上传可以同时上传多个文件,而单文件上传只能上传一个文件。在实际应用中,多文件上传通常适用于需要同时上传多个文件的场景,比如上传多张图片、多个文档等;而单文件上传则适用于只需要上传一个文件的场景,比如上传头像、上传附件等。多文件上传通常要使用专门的插件或工具库来实现,比如jQuery File Upload、Dropzone.js等。

    在Controller层中加入以下代码,如下:

     

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

     效果展示

    jrebel的使用

    jrebel的好处

    多文件上传跟单文件上传的区别

    多文件上传和单文件上传的区别在于,多文件上传可以同时上传多个文件,而单文件上传只能上传一个文件。在实际应用中,多文件上传通常适用于需要同时上传多个文件的场景,比如上传多张图片、多个文档等;而单文件上传则适用于只需要上传一个文件的场景,比如上传头像、上传附件等。多文件上传通常要使用专门的插件或工具库来实现,比如jQuery File Upload、Dropzone.js等。

    jrebel的好处

    JRebel是一个Java开发工具,它提供了一种在开发过程中实时更新和重新加载Java代码的能力,而无需重新启动应用程序或重新部署。以下是JRebel的一些好处:

    1. 快速代码更新:JRebel允许开发人员在修改代码后立即看到变化的效果,无需重新编译和部署整个应用程序,从而提高了开发效率。

    2. 减少重启时间:传统的Java开发过程中,每次对代码进行修改后都需要重新启动应用,这会花费大量时间。而使用JRebel,可以避免重启,节省开发时间。

    3. 保持应用状态:JRebel在代码重新加载时,会尽量保持应用程序的状态,包括会话、数据库连接等,从而减少重新登录或重新建立连接的麻烦。

    4. 提高测试效率:JRebel能够加快代码更新的速度,使得开发人员可以更快地进行测试和调试,及时发现和修复问题。

    5. 支持广泛的框架和服务器:JRebel可以与多种Java框架和服务器兼容,包括Spring、Hibernate、Tomcat等,使得它可以适用于各种不同的开发环境。

    总的来说,JRebel能够大大提升Java开发人员的工作效率,减少开发和调试过程中的重启时间,让开发过程更加流畅和高效。

    jerbel的安装 

     

     

     重启后的IDEA是这样的:

    但是此时我们还需要打开代理(黑窗口)才可以用jrebel启动项目。如下: 

    设置jrebel离线 

    打开代理后点击jrebel启动项目,会弹出以下窗口,具体操作如下:

    1.在弹出框中Team URL下方第一个输入框输入:

     http://127.0.0.1:8888/0e63ac70-2074-46d3-9de1-46fb2befde0a

    2.在第二个输入框输入自己的邮箱。

    3.勾选 I agree with the term...

    4.最后点击最下方按钮Activete JRebel即可。

    设置完jrebel离线之后,在用jrebel插件启动项目之前就可以不打开代理辅助工具了。 

    今天的分享就到这里了!!!!!!!!!!!

  • 相关阅读:
    国民技术N32G45x双ADC规则同步模式配置
    Windows上使用client-go远程访问安装在本地WMware上的Linux虚拟机里的minikube
    [NOIP2007 提高组] 字符串的展开
    (一)Linux环境的学习环境的搭建
    【Vue3 源码解析】watch 侦听器
    MHA+MYCAT 高可用架构
    C++期末课设—图书管理系统
    Go注册GRPC服务遇到接口未实现报错处理方法
    MyBatis-Plus生成sql语句时怎么知道表名和表的字段名,表的主键名的
    10、网关详细设计文档
  • 原文地址:https://blog.csdn.net/m0_74934282/article/details/132798342