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

2023-10-27

目录

前言        

一、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依赖

添加文件上传依赖

 <commons-fileupload.version>1.3.3</commons-fileupload.version>
   
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>${commons-fileupload.version}</version>
    </dependency>

2.配置文件上传解析器

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

<!--  处理文件上传下载问题  -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 文件最大大小(字节) 1024*1024*50=50M-->
        <property name="maxUploadSize" value="52428800"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>

3.数据表

配置表信息,并生成代码

generatorConfig.xml :

<table schema="" tableName="t_user_head" domainObjectName="User"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

4.配置文件

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

resource.properties:

#本地路径
dir=D:/temp/upload/
#服务器路径
server=/upload/

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

package com.ctb.utils;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesUtil {
 
    public static String getValue(String key) throws IOException {
        Properties p = new Properties();
        InputStream in = PropertiesUtil.class.getResourceAsStream("/resource.properties");
        p.load(in);
        return p.getProperty(key);
    }
}

配置文件映射路径

5.前端jsp页面

首页

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@include file="/common/header.jsp"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>用户列表</title>
</head>
<body>
<form class="form-inline"
      action="/user/list" method="post">
    <div class="form-group mb-2">
        <input type="text" class="form-control-plaintext" name="uname"
               placeholder="请输入用户名称">
    </div>
    <button type="submit" class="btn btn-primary mb-2">查询</button>
    <a class="btn btn-primary mb-2" href="/user/detail">新增</a>
</form>

<table class="table table-striped">
    <thead>
    <tr>
        <th scope="col">用户编号</th>
        <th scope="col">用户名称</th>
        <th scope="col">用户头像</th>
        <th scope="col">操作</th>
    </tr>
    </thead>
    <tbody>
    <c:forEach  var="b" items="${lst }">
        <tr>
            <td>${b.id }</td>
            <td>${b.uname }</td>
            <td>
                <img src="${b.upic }" style="height: 100px" width="60px">
            </td>
            <td>
                <a href="/user/detail?id=${b.id}">修改</a>
                <a href="/user/del/${b.id}">删除</a>
                <a href="/page/user/upload?id=${b.id}">文件上传</a>
                <a href="/user/download?id=${b.id}">文件下载</a>
            </td>
        </tr>
    </c:forEach>
    </tbody>
</table>
<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<z:page pageBean="${pageBean }"></z:page>
</body>
</html>

文件上传表单

<%--
  Created by IntelliJ IDEA.
  User: 86155
  Date: 2023/9/9
  Time: 15:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>头像上传</title>
</head>
<body>
<form action="/user/upload" method="post" enctype="multipart/form-data">
    <label>用户编号:</label><input type="text" name="id" readonly="readonly" value="${param.id}"/><br/>
    <label>用户头像:</label><input type="file" name="uu"/><br/>
    <input type="submit" value="上传图片"/>
</form>

<%--多文件上传--%>
<form method="post" action="/user/uploads" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="submit">上传</button>
</form>

</body>
</html>

6.controller层

package com.ctb.controller;


import com.ctb.biz.UserBiz;
import com.ctb.model.User;
import com.ctb.utils.PageBean;
import com.ctb.utils.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;


@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserBiz userBiz;
//    增
    @RequestMapping("/add")
    public String add(User user){
        int i = userBiz.insertSelective(user);
        return "redirect:list";
    }
//    删
    @RequestMapping("/del/{id}")
    public String del(@PathVariable("id") Integer id){
        userBiz.deleteByPrimaryKey(id);
        return "redirect:/user/list";
    }

//    改
    @RequestMapping("/edit")
    public String edit(User user){
        userBiz.updateByPrimaryKeySelective(user);
        return "redirect:list";
    }
    @RequestMapping("/upload")
    public String upload(User user,MultipartFile uu){
        try {
        //上传图片本地路径
        String dir= PropertiesUtil.getValue("dir");
        //网络访问地址
        String server=PropertiesUtil.getValue("server");
        //文件名
        String filename = uu.getOriginalFilename();
        //文件类别
//        String type = uu.getContentType();
            FileUtils.copyInputStreamToFile(uu.getInputStream(),new File(dir+filename));
            user.setUpic(server+filename);
            userBiz.updateByPrimaryKeySelective(user);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }
    //多文件下载
    @RequestMapping("/uploads")
    public String uploads(HttpServletRequest req,  User user, MultipartFile[] files){
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile cfile : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = PropertiesUtil.getValue("dir");
                String server = PropertiesUtil.getValue("server");
                String filename = cfile.getOriginalFilename();
                FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }
//    查
    @RequestMapping("/list")
    public String list(User user, HttpServletRequest request){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(request);
        List<User> Users = userBiz.listPager(user, pageBean);
        request.setAttribute("lst",Users);
        request.setAttribute("pageBean",pageBean);
        return "user/list";
    }
//    查询单个
    @RequestMapping("/detail")
    public String preSave(User user, Model model){
        if(user != null && user.getId() != null && user.getId() != 0){
            User u = userBiz.selectByPrimaryKey(user.getId());
            model.addAttribute("b",u);
        }
        return "user/edit";
    }
    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(User user,HttpServletRequest req){

        try {
            //先根据文件id查询对应图片信息
            User u = this.userBiz.selectByPrimaryKey(user.getId());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
            System.out.println(diskPath);
            String realPath = u.getUpic().replace(reqPath,diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
            //下载关键代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }


}

7.测试结果

文件上传

文件下载

多文件上传

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC文件的上传下载&JRebel的使用 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • Ant Design Vue(2.2.8) 组件样式覆盖 -- 非弹窗和弹窗 -- 全局非全局

    1 简单覆盖 非弹窗 deep 类名 div class deviceFirmManage common box div class search box div div
  • 动态通讯录

    目录 1 修改联系人结构体 2 修改初始化功能 3 增加判断通讯录是否需要扩容 4 修改删除功能 在静态内存的基础之上 我们试着用动态内存开辟空间的方式去修改通讯录 动态通讯录是对静态通讯录的补充 只需要修改部分代码就可行 1 修改联系人结
  • 人工智能中蕴含的情商

    古语云 人之初 性本善 性相近 习相远指的是生于天地之间的为人处事之道 善良并不意味着胆小与懦弱 格物斯坦认为善良的人往往具有较高的情商和组织协调能力 善待世间的一切天地万物 一切是非恩怨 一切明争暗斗 且听吾分析到来 有句话是这样说的 情
  • Building an MFC project for a non-Unicode character set is deprecated

    VS2013多字节工程问题 使用VS2013编译旧版VC 程序时 提示Building an MFC project for a non Unicode character set is deprecated 微软提供了解决方案 一 错误信
  • 关于cmake qmake make makeile之间的关系问题

    总之 qmake是根据 pro文件生成makefile文件 同理cmake是根据CMakeList txt生成的makefile文件 make再根据makefile文件来编译工程文件 来完成 预编译 gt 编译 gt 汇编 gt 链接 中的
  • 使用命令行将Windows上的Git升级到最新版本

    关于Git的命令有很多 这里简单说一下和版本升级有关的几条吧 查看版本信息 git version 在2 14 2和2 16 1之间的版本中 命令是git update 从Git 2 16 1开始 您可以使用git update git f
  • Struts2中关于"There is no Action mapped for namespace / and action name"的总结

    参考 http www cnblogs com gulvzhe archive 2011 11 21 2256632 html 今天在调试一个基础的Struts2框架小程序 总是提示 There is no Action mapped fo
  • 深度学习六、图像风格迁移

    所谓图像风格迁移 是指利用算法学习著名画作的风格 然后再把这种风格应用到另外一张图片上的技术 1 图像风格迁移的原理 在学习原始的图像风格迁移之前 可以先回忆一下ImageNet图像识别模型VGGNet 事实上 可以这样理解VGGNet的结
  • 云学python (第5章对象带你飞之储存 上下文管理器pickle 包)《vamei-从Python开始学编程》 笔记

    2 上下文管理器 文件操作常常和上下文管理器一起使用 上下文管理器 context manager 用于规定某个对象的使用范围 一旦进入或者离开该使用范围 则会有特殊操作被调用 比如为对象分配或者释放内存 下面是一段常规的文件操作程序 常规
  • RabbitMq消息收发详解(转)

    消费者有两种接收消息的方法 poll consumer 即拉模式 消费者主动去消息队列拉取消息 push consumer 即推模式 消息队列主动往消费者推送消息 一 消费者通过推 PUSH 方式获取消息 实现push模式最简单的方式就是使
  • Cmake中的Glog用法浅析

    Cmake中的Glog用法浅析 Glog是谷歌开源的C 日志库 用来记录程序运行时的输出信息 这里有几篇关于Glog库用法的博客 网址如下 http blog csdn net chdhust article details 5181337
  • 动态住宅代理VS静态住宅代理,怎么选择?

    现在 越来越多的海外代理服务商均支持动态住宅IP与静态住宅IP 很多小伙伴就疑惑 这二者有什么区别呢 哪个更好 其实 没有哪个更好 只有哪一个更合适您的业务 无论动态住宅IP还是静态住宅IP都来自真实的住宅IP地址 都可以提供IP隐匿作用
  • 电机矢量控制方法

    在工业控制领域 电动机是一个重要的研究方向 发电厂60 的能量都去驱动电动机来为人类服务 可见电机的控制在工业以及军事方面的重要性 电动机分为直流电机和交流电机 而交流电机包括同步交流电机和异步交流电机 同步电动机和异步电动机的区别在于 同
  • 跳出for循环

    跳出for循环有三种方式 1 continue 跳出当次循环 可继续进行下一个循环 function ceshi for var i 0 i lt 6 i if i 3 continue console log i ceshi 效果图 2
  • 如何设计管理员和用户登录界面C语言,管理员登录设计(第7节)

    本文实现管理员登录效果 当用户名和密码正确时 弹出登录成功提示 否则弹出用户名或密码错误提示 今天有以下三大学习任务 学习任务一 了解命名空间的定义 定义 namespace 空间名 类 引用 using 空间名 学习任务二 实现管理员登陆
  • 【micropython】SPI触摸屏开发

    背景 最近买了几块ESP32模块 看了下mircopython支持还不错 所以买了个SPI触摸屏试试水 记录一下使用过程 硬件相关 SPI触摸屏 使用2 4寸屏幕 常见淘宝均可买到 驱动为ILI9341 具体参数如下图 引脚描述 ESP32
  • C++中【字符串】与【整型】和【浮点型】转换攻略

    异想之旅 本人原创博客完全手敲 绝对非搬运 全网不可能有重复 本人无团队 仅为技术爱好者进行分享 所有内容不牵扯广告 本人所有文章仅在CSDN 掘金和个人博客 一定是异想之旅域名 发布 除此之外全部是盗文 C 算法刷题等过程中经常会遇到字符
  • 化工安全生产管理平台:融合重大危险源监控预警、可燃有毒气体检测报警、企业安全风险分区于一体

    产品概述 化工企业安全生产信息化管理平台 以实现化工企业安全生产数字化 信息化 智能化管理为目标 建设融合重大危险源监控预警管理 可燃有毒气体检测报警管理 企业安全风险分区管理 生产人员在岗在位管理和企业生产全流程管理于一体的安全生产信息化
  • 测试从业1到3年经验,常见软件测试工程师面试题总结

    前言 软件测试工程师 和开发工程师相比起来 虽然前期可能不会太深 但是涉及的面还是比较广的 前期面试实习生或者一年左右的岗位 问的也主要是一些基础性的问题比较多 涉及的知识主要有MySQL数据库的使用 Linux操作系统的使用 软件测试框架
  • SpringMVC文件的上传下载&JRebel的使用

    目录 前言 一 JRebel的使用 1 IDea内安装插件 2 激活 3 离线使用 使用JRebel的优势 二 文件上传与下载 1 导入pom依赖 2 配置文件上传解析器 3 数据表 4 配置文件 5 前端jsp页面 6 controlle