一篇博客教会您SpringMVC文件上传、下载,多文件上传及工具jrebel的使用

news2025/1/20 15:52:04

目录

一.文件上传

 二.文件下载

三.多文件上传

四,jrebel的介绍


前言:

我们之前已经实现了SpringMVC的增删改查,今天这一篇博客教会您SpringMVC文件上传、下载,多文件上传及工具jrebel的使用,希望这篇博客能够给正在学习,工作的您带来帮助!!!

一.文件上传


1.导入依赖

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>


2.配置文件上传解析器
在spring-mvc.xml文件中添加文件上传解析器。

3.配置文件上传解析器

在WEB-INF目录下的spring-mvc.xml文件中添加文件上传解析器。

<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>

CommonsMultipartResolver是MultipartResolver接口的实现类。

MultipartResolver是用于处理文件上传,当收到请求时DispatcherServlet的checkMultipart()方法会调用MultipartResolver的isMultipart()方法判断请求中是否包含文件,如果请求数据中包含文件,则调用MultipartResolver的resolverMultipart()方法对请求的数据进行解析,然后将文件数据解析MultipartFile并封装在MultipartHTTPServletRequest(继承了HTTPServletRequest)对象中,最后传递给Controller。

  • MultipartResolver

public interface MultipartResolver {
    //判断是否存在文件流
    boolean isMultipart(HttpServletRequest var1);
    //解析http请求,并将请求封装到MultipartHttpServletRequest对象中
    MultipartHttpServletRequest resolveMultipart(HttpServletRequest var1) throws MultipartException;
    //清理上传的资源
    void cleanupMultipart(MultipartHttpServletRequest var1);
}

4.表单设置

表单提交方式为method="post"和enctype="multipart/form-data"

<form action="${ctx}/clz/upload" method="post" enctype="multipart/form-data">
    <label>班级编号:</label><input type="text" name="cid" readonly="readonly" value="${param.cid}"/><br/>
    <label>班级图片:</label><input type="file" name="cfile"/><br/>
    <input type="submit" value="上传图片"/>
</form>

项目部署到服务器上(发布项目)

5.文件上传实现

.resource.properties文件

dir = D:/tp/upload/

server = /upload/

@RequestMapping("/upload")
    public String upload(HttpServletRequest req, Clazz clazz, MultipartFile cfile){
        try {
            //思路:
            //1) 将上传图片保存到服务器中的指定位置
            String dir = PropertiesUtil.getValue("dir");
            String server = PropertiesUtil.getValue("server");
            String filename = cfile.getOriginalFilename();
            FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
            //2) 更新数据库表t_struts_class图片记录
            clazz.setPic(server+ filename);
            clazzBiz.updateByPrimaryKeySelective(clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

编写前端页面
 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/book/upload" method="post" enctype="multipart/form-data">
    <label>书籍编号:</label><input type="text" name="bid" readonly="readonly" value="${param.bid}"/><br/>
    <label>书籍图片:</label><input type="file" name="bfile"/><br/>
    <input type="submit" value="上传图片"/>
</form>
 
</body>
</html>

 二.文件下载

1.在controller层加入以下代码 
 

@RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(HBook hBook, HttpServletRequest req){
 
        try {
            //先根据文件id查询对应图片信息
            HBook clz = this.hBookbiz.selectByPrimaryKey(hBook.getBid());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
            String realPath = clz.getImg().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;
    }

三.多文件上传


多文件上传和普通文件上传的区别在于多文件上传可以提高上传效率,减少了选择和上传文件的次数。而普通文件上传只能一次上传一个文件,适用于只需要上传单个文件的场景。

@RequestMapping("/uploads")
    public String uploads(HttpServletRequest req, HBook hBook, 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";
    }

四,jrebel的介绍

1.jrebel是什么?

JRebel 是一个Java 开发工具,它可以避免在进行Java应用程序开发时频繁的重新部署和重启,从而提高开发效率。并保持应用程序状态,使开发过程更加顺畅和高效。

2.如何在idea中安装使用?

安装:打开idea--》File--》Settings--》Plugins--》在Marketplace中搜索

下载好了重启idea

按照顺序:先打开代理ReverseProxy_windows_amd64.exe

                  使用jrebel启动项目

设置离线:打开idea--》File--》Settings--》JRebel & XRebel

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

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

相关文章

二、Spark 调度系统

目录 Spark 调度系统DAGSchedulerSchedulerBackendTaskSchedulerExecutorBackendSpark 任务调度流程 Spark 调度系统 分布式计算的精髓&#xff0c;在于如何把抽象的计算图&#xff0c;转化为实实在在的分布式计算任务&#xff0c;然后以并行计算的方式交付执行。 Spark调度系…

Mojo安装使用初体验

一个声称比python块68000倍的语言 蹭个热度&#xff0c;安装试试 系统配置要求&#xff1a; 不支持Windows系统 配置要求: 系统&#xff1a;Ubuntu 20.04/22.04 LTSCPU&#xff1a;x86-64 CPU (with SSE4.2 or newer)内存&#xff1a;8 GiB memoryPython 3.8 - 3.10g or cla…

华为云云耀云服务器L实例评测 | 分分钟完成打地鼠小游戏部署

前言 在上篇文章【华为云云耀云服务器L实例评测 | 快速部署MySQL使用指南】中&#xff0c;我们已经用【华为云云耀云服务器L实例】在命令行窗口内完成了MySQL的部署并简单使用。但是后台有小伙伴跟我留言说&#xff0c;能不能用【华为云云耀云服务器L实例】来实现个简单的小游…

车载诊断数据库——诊断问卷调查表与CDD关联关系

车载诊断数据库——诊断问卷调查表与CDD关联关系 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

超级电容-电池-超级电容混合储能系统能量管理simulink仿真建模模型

建立混合储能系统模型 在Simulink中&#xff0c;首先需要建立一个超级电容和蓄电池并联的混合储能系统模型。其中&#xff0c;超级电容和蓄电池的荷电状态&#xff08;SOC&#xff09;需要根据实际情况进行管理。荷电状态可以通过对电池和超级电容的电压、电流等进行测量&…

说透 Nacos 一致性协议

1 Nacos ⼀致性协议 1.1 为什么 Nacos 需要⼀致性协议 Nacos尽可能减少用户部署以及运维成本&#xff0c;做到用户只需要⼀个程序包&#xff0c;就快速单机模式启动 Nacos 或集群模式启动 Nacos。而 Nacos 是⼀个需要存储数据的组件&#xff0c;为实现目标&#xff0c;就要在…

透视俄乌网络战之二:Conti勒索软件集团(上)

透视俄乌网络战之一&#xff1a;数据擦除软件 Conti勒索软件集团&#xff08;上&#xff09; 1. Conti简介2. 组织架构3. 核心成员4. 招募途径5. 工作薪酬6. 未来计划参考 1. Conti简介 Conti于2019年首次被发现&#xff0c;现已成为网络世界中最危险的勒索软件之一&#xff0…

汇川PLC学习Day3:轴控代码编写、用户程序结构说明与任务配置示例、

汇川PLC学习Day3&#xff1a;轴控代码编写、用户程序结构说明、任务配置示例 一、新建轴与轴控代码编写 1. 新建轴 (1)新建一个轴 &#xff08;2&#xff09;将轴名字更新为实际名字 可以后面实例化后再更改&#xff0c;汇川可以在更新名字时同步更新其他编写的代码名字&a…

GStreamer时钟同步

播放复杂媒体时&#xff0c;每个audio和video sample必须在特定时间按特定顺序播放。为此&#xff0c;GStreamer提供了一种同步机制&#xff0c;通过使用 GstClock object、buffer timestamps和SEGMENT event来实现&#xff1a; &#xff08;1&#xff09;GstClock&#xff1a;…

Java中如何获取一个字符串是什么类型

Java中如何获取一个字符串是什么类型&#xff1f; 在Java中&#xff0c;您可以使用一些方法来确定一个字符串的类型。下面是一些常用的方法&#xff1a; 使用正则表达式&#xff1a;您可以使用正则表达式来匹配字符串是否符合特定的模式或格式&#xff0c;以确定其类型。例如&…

【Linux入门指北】Linux磁盘扩容

文章目录 1、给 / 分区扩容 Linux在使用过程中由于数据量不断增大&#xff0c;导致磁盘空间不足&#xff0c;需要增加磁盘空间&#xff0c;主要有以下三种方式: 直接给 / 分区&#xff08;或者某一分区&#xff09;扩容&#xff0c;直接在原有磁盘上增大空间给虚拟机新增一块磁…

typeScript 学习笔记(二)

类接口 TypeScript 入门教程 (xcatliu.com) 十四.类 ① 类 类&#xff1a;定义了一件事物的抽象特点&#xff0c;包含它的属性和方法对象&#xff1a;类的实例&#xff0c;通过new生成面向对象&#xff08;OOP&#xff09;的三大特性&#xff1a;封装、继承、多态封装&…

C++学习笔记(重载、类)

C 1、函数重载2、类2.1、类的方法和属性2.2、类的方法的定义2.3、构造器和析构器2.4、基类与子类2.5、类的public、protected、private继承2.6、类的方法的重载2.7、子类方法的覆盖2.8、继承中的构造函数和析构函数 1、函数重载 函数重载大概可以理解为&#xff0c;定义两个名…

Rethink LSTMGRU

LSTM 设计思想 姑且不看偏置。 W W W 和 U U U 是加权的矩阵&#xff0c;写模型的时候用 nn.Linear(in_dim, out_dim) 就成&#xff1b; σ \sigma σ 是 Sigmoid 函数 第一条&#xff0c;遗忘门&#xff0c;定义为 有多少内容需要被遗忘&#xff1b;第二条&#xff1a;输入门…

ES8生产实践——pod日志采集(Fluentd方案)

Fluentd介绍 Fluentd是一个是一个开源的日志收集和传输工具&#xff0c;旨在解决日志数据的收集、传输和处理问题&#xff0c;它可以收集来自于各种系统或应用的日志&#xff0c;转化为用户指定的格式后&#xff0c;转发到用户所指定的日志存储系统之中。 用图来说明问题的话&…

【安装mysql(基础安装+主从复制)】

由于我的 centos 版本是 aarch64 版本 安装链接&#xff1a; 1、aarch64 版本 linux 系统安装 mysql 2、安装完成之后是不能用 navicat 进行直接访问的&#xff0c;需要如下设置&#xff1a; mysql -uroot -proot&#xff08;明文登陆&#xff0c;记得 -uroot 和 -proot之间…

Redis 基础总结

1、NoSQL概述 1.1 数据库分类 目前数据库分&#xff1a;关系型数据库与非关系型数据库 常用的关系型数据库&#xff1a; Oracle&#xff0c;MySQL&#xff0c;SqlServer&#xff0c;DB2 常用的非关系数据库&#xff1a;Redis&#xff0c;MongoDB&#xff0c;ElasticSearch&…

MIT 6.S081学习笔记(第一章)

〇、前言 本章主要是关于实验环境的搭建和完成 LAB UTIL。 平台&#xff1a;阿里云 Ubuntu20.04VScode on macOS&#xff08;M1 Apple Silicon&#xff09;。 一、环境搭建 1、QEMU QEMU&#xff08;quick emulator&#xff09;是一款由法布里斯贝拉&#xff08;Fabrice Bel…

C++中多态的底层实现

1.先来看一波比较容易出错的题 会打印出来什么&#xff1f; 其实打印出来的是B->1;为什么呢&#xff1f;看我如何讲解的。 2.思考为什么只有引用或则指针才能触发多态 结论&#xff1a;子类赋值给父类对象切片&#xff0c;不会拷贝虚标 我听老师上面的解释是&#xff1a;如…