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

news2025/1/11 18:50:17

目录

前言        

一、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.测试结果

文件上传

文件下载

多文件上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IE浏览器打开变成别的浏览器怎么办

最近很多朋友发现自己的IE浏览器打开时会自动跳转到别的浏览器上去&#xff0c;又不知道怎么恢复回来。所以今天小编就来告诉大家解决的方法&#xff0c;下面就是详细的教程&#xff0c;想知道的快来看看吧。 IE浏览器打开变成别的浏览器解决方法 方法一 1、打开的浏览器中找…

DataTables.js综合应用开发(ajax筛选查询、同列数据汇总、环比数据)

筛选数据 <!--筛选数据--><div class"layui-card" style"margin-bottom: 50px;"><div class"layui-row"><form class"layui-form layui-col-md12" style"margin: 10px;"><div class"demoTa…

百望云蝉联2023「Cloud 100 China 」榜单 综合实力再获认可

9月7日&#xff0c;2023 Cloud 100 China 榜单于上海中心正式发布&#xff0c;榜单由靖亚资本与崔牛会联合推出&#xff0c;百望云凭借着过硬的综合实力与卓越的技术创新能力&#xff0c;再次荣登榜单&#xff0c;位居第六位。 本届评选&#xff0c;Top 100 企业的数据指标的权…

EMC滤波器对DC电源模块影响有多大?

BOSHIDA EMC滤波器对DC电源模块影响有多大&#xff1f; 随着电子设备的广泛应用&#xff0c;EMC&#xff08;电磁兼容性&#xff09;问题越来越受到关注。而EMC滤波器作为一种常见的电路器件&#xff0c;其作用在于抑制电源的干扰和防止外界干扰的影响。在DC电源模块的设计中&…

直击永悦科技半年报:双轮驱动下的“增长曲线”

詹姆斯卡斯的著作《有限与无限的游戏》中&#xff0c;传递出这样一种观点&#xff1a; “有限的游戏&#xff0c;其目的在于赢得胜利&#xff1b;无限的游戏&#xff0c;却旨在让游戏永远进行下去。有限的游戏在边界内玩&#xff0c;无限的游戏玩的就是边界。” 企业要实现持…

ME21N 采购订单新增页签增强

1、实现效果 根据客制化需求&#xff0c;要在采购订单中新增大量字段&#xff0c;所以要在界面上添加一个单独的页签。效果如下&#xff1a; 2、增强实现 2.1、增强结构 因为是在抬头上边添加&#xff0c;所以增强CI_EKKODB结构 2.2、函数组 仿照Function Group MEPOBADIEX…

vue 项目npm 打包遇到的一些bug记录

问题场景 &#xff1a;npm 的版本正确&#xff0c;nodejs 的版本也是正常的&#xff0c;之前npm run build 打包都正常没问题&#xff0c;但是因为其他原因电脑重装了&#xff0c;环境重新配置了。npm run dev 跑没问题,打包就报错了&#xff0c;信息如下&#xff1a; rc/util…

Java从入门到精通-数组(三)

0. 数组 1. 数组概述 练习1&#xff1a; 创建一个整数数组&#xff0c;存储喜欢的5个数字&#xff0c;并编写代码打印出这些数字。 创建一个整数数组 public class Main {public static void main(String[] args) {// 创建一个整数数组&#xff0c;存储5个喜欢的数字int[] f…

G4学术期刊《中学教学参考》简介及投稿要求

G4学术期刊《中学教学参考》简介及投稿要求 《中学教学参考》为广西教育学院杂志社主办的国内外公开发行刊物&#xff0c;坚持为基础教育服务的宗旨&#xff0c;竭诚为全国教育工作者服务&#xff0c;提供最新教改信息和教育理论成果&#xff0c;为广大教育工作者交流经验、发…

python系列:requests库+BS4库及综合实例

仅供学习、交流使用&#xff0c;不具有任何商业用途&#xff0c;如有问题请及时联系我们以作处理。 文章目录 前言requests安装使用第一种 requests.request("请求方式", ...)第二种 requests.请求方式(参数)URL中传递参数 paramsxx响应内容 r.text二进制响应内容 r.…

从零开始的PICO教程(1)Pico游戏开发项目配置

从零开始的PICO教程&#xff08;1&#xff09;Pico游戏开发项目配置 文章目录 从零开始的PICO教程&#xff08;1&#xff09;Pico游戏开发项目配置一、前言1、大纲 二、成为Pico开发者1、注册 PICO 开发者帐号2、创建组织3、创建应用 三、导入PICO的SDK1、PICO设备开启 “开发者…

一文了解数据科学Notebook

编者按&#xff1a; 主要介绍什么是Notebook&#xff0c;Notebook在数据科学领域的应用的重要性与优势&#xff0c;以及数据科学家/算法团队在选择Notebook时需考虑哪些关键因素。同时&#xff0c;基于Notebook的筛选考量维度&#xff0c;对常见的Notebook进初步对比分析&#…

volatile、ReentrantLock和synchronized保证线程可见性原理

主存、工作内存 在了解什么是线程可见性前&#xff0c;我们先来简单了解下 Java内存模型 的主存、工作内存抽象概念 主存&#xff1a; 存储的是一些共享资源的存储位置&#xff08;例如静态变量等&#xff09; 工作内存&#xff1a; 每个线程对应的栈内存对应的私有局部…

JAVASE 游戏

朴素的拼图游戏&#xff0c;通过WASD移动&#xff0c;我自己都不太会&#xff0c;可以通过篡改内部代码来取得想要的成功彩蛋 代码&#xff1a; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.…

如何使用autotools制作Makefile

本文将通过一个例子介绍如何使用autotools制作Makefile&#xff0c;最终运行可执行文件。 本例子中使用的源代码a.c如下。 #include "stdio.h" void main() {int a,b;int c;printf("请输入两个数&#xff1a;\n");scanf("%d %d",&a,&b)…

大数据课程L3——网站流量项目的系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的运行环境; ⚪ 了解网站流量项目的日志采集系统搭建; ⚪ 了解网站流量项目的离线业务系统搭建; ⚪ 了解网站流量项目的Hive做离线数据处理; ⚪ 了解网站流量项目的…

盲打键盘的正确指法指南

简介 很多打字初学者&#xff0c;并不了解打字的正确指法规范&#xff0c;很容易出现只用两根手指交替按压键盘的“二指禅”情况。虽然这样也能实现打字&#xff0c;但是效率极低。本文将简单介绍盲打键盘的正确指法&#xff0c;以便大家在后续的学习和工作中能够提高工作效率…

Nacos安装及在项目中的使用

目录 概要一、安装 Nacos1、下载 Nacos2、解压3、启动 Nacos 服务器4、自定义Nacos启动脚本5、访问Nacos Web控制台 二、Nacos----服务注册与发现1、添加 Nacos 依赖2、配置 Nacos 服务器地址3、使用 Nacos 注册服务4、启动服务 三、Nacos----配置管理1、创建配置数据2、从 Nac…

技师学院物联网实训室建建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

深圳站WOT全球技术创新大会2023,精彩即将开启!

前几天刷屏的“中国大模型顶流群聊笔记”想必很多人都看到了&#xff0c;包括百川智能创始人&CEO王小川&#xff0c;创新工场董事长、零一万物创始人李开复&#xff0c;澜舟科技CEO周明在内的20多位中国大模型领域模型层、工具层、应用层的“顶流”们&#xff0c;在西溪湿地…