SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置

news2024/11/25 16:33:28

一.文件上传

1.导入依赖

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

2.配置文件上传解析器

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

CommonsMultipartResolverMultipartResolver接口的实现类。

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

3.配置服务器存放文件地址

3.1. 

3.2 将项目部署到服务器上

 3.3 配置相应路径

3.4 选择我们control层的方法中定义的路径

 

 3.5 最后保存好即可

4.导入PropertiesUtil工具类

1.通过PropertiesUtil工具类加载配置页目录文件

package com.YU.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);
	}
	
}

2.同时在代码中我们可以发现,通过工具类读取resource.properties文件,在配置文件resource.properties中,我们将一些服务器存放文件地址定义在该文件中,方便我们后期修改配置文件

3.resource.properties文件

dir = D:/deposit/upload/
server = /upload/

5.编写Controller层

 通过Controller层利用MultipartFile类接收前端传递的文件到后台,以流的方式上传到服务器中,

并将数据库中数据的字段(图片路径)进行修改

//文件上传
    @RequestMapping("/upload")
    public String upload(HBook hBook,MultipartFile bfile){
        try {
        String dir = PropertiesUtil.getValue("dir");
        String server = PropertiesUtil.getValue("server");
        String filename = bfile.getOriginalFilename();
        FileUtils.copyInputStreamToFile(bfile.getInputStream(), new File(dir + filename));
        hBook.setImg(server+filename);

        hBookbiz.updateByPrimaryKeySelective(hBook);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

6.编写前端页面

编写前端页面表单,通过post请求的方式将图片上传到服务器,并将数据进行修改

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

注意:表单的提交方式为enctype="multipart/form-data" ,它是一个HTML表单属性,用于指定将表单数据编码为多部分(multipart)的格式,以便支持文件上传,文件上传需要额外的服务器端处理逻辑,包括文件存储、验证、处理等。在服务器端代码中,需要根据我们的需求来处理上传的文件

7.测试结果

我们在将数据传输到服务器时,可以通过查看服务器部署的地址查看我们传输的文件

 

 二.文件下载

我们通过controller层调用请求方法,获取到服务器本地请求地址,并将网络请求地址替换成本地,截取当前名称进行+1作为下载名称,再获取请求头信息,以二进制流的形式进行转换,并通过ResponseEntity将文件内容以字节数组的形式作为响应主体返回给客户端

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

2.测试结果

三.多文件上传

多文件上传和普通文件上传的区别在于form表单提交的参数不同和controller层的上传形式不同

 1.controller层

获取上传文件的原始文件名:String filename = cfile.getOriginalFilename();

根据配置文件中指定的服务器目录保存上传文件:FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename)); 这里使用了 FileUtils 工具类将文件内容复制到指定的服务器目录中。

将文件名追加到 sb 对象中:sb.append(filename).append(",");

最后,将 sb.toString() 输出到控制台。

如果有任何异常发生,将打印异常栈轨迹。

最后,方法返回 "redirect:list",将客户端重定向到名为 list 的页面。

@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";
    }

2.前端页面

<form method="post" action="${pageContext.request.contextPath }/book/uploads" enctype="multipart/form-data">    <input type="file" name="files" multiple>    <button type="submit">上传</button></form>

3.测试结果

 

本期文件下载到这里就结束了,感谢各位大大的观看,三连是博主更新的动力,感谢谢谢谢谢!!!!

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

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

相关文章

掌握API数据检索:过滤和排序的综合指南

API可以返回大量的数据&#xff0c;这使得开发人员很难只检索他们需要的信息。这就是API的过滤和排序功能的用武之地。 过滤和排序是API设计的两个基本功能&#xff0c;它们允许开发人员有效地从API检索特定的数据。过滤使开发人员能够通过指定返回的数据必须满足的标准来缩小A…

【用unity实现100个游戏之11】复刻经典消消乐游戏

文章目录 前言开始项目开始一、方块网格生成二、方块交换三、添加交换的动画效果四、水平消除检测五、垂直消除检测六、完善删除功能七、效果优化&#xff08;移动方块后再进行消除检测&#xff09;八、方块下落十、方块填充十一、后续 源码参考完结 前言 欢迎来到经典消消乐游…

第13节-PhotoShop基础课程-裁剪工具

文章目录 前言1.裁剪工具1.基本操作 Alt Shift2.拉直3.内容识别 自动填充 2.透视裁剪工具3.切片工具-长图分成多个4.切片选择工具5. 存储为一张一张 前言 1.裁剪工具 1.基本操作 Alt Shift 2.拉直 可以矫正图片 3.内容识别 自动填充 2.透视裁剪工具 可以拉正图片 3.切片工具-…

SpringAOP的实现机制(底层原理)、应用场景等详解

SpringAOP的实现机制&#xff08;底层原理&#xff09;应用场景等详解 ​ Spring框架是Java开发中最流行的应用程序框架之一。它提供了广泛的功能&#xff0c;其中之一就是面向切面编程&#xff08;AOP&#xff09;。Spring AOP允许我们将关注点&#xff08;例如日志记录、事务…

微信小程序源码

1&#xff1a;仿豆瓣电影微信小程序 https://github.com/zce/weapp-demo 2&#xff1a;微信小程序移动端商城 https://github.com/liuxuanqiang/wechat-weapp-mall 3&#xff1a;Gank微信小程序 https://github.com/lypeer/wechat-weapp-gank 4&#xff1a;微信小程序高仿QQ…

【小笔记】当一个算法性能不满意,可能是这几方面的原因

【学而不思则罔&#xff0c;思而不学则殆】 2023.9.9 原因一&#xff1a;数据质量有问题 数据决定了算法的上限&#xff0c;在大模型时代&#xff0c;这句话仍然管用&#xff08;比如open AI对数据的标注要求就非常高&#xff09;数据的问题主要有这几方面&#xff1a; 1. …

CSDN每日一练 |『括号上色』『严查枪火』『数组排序』2023-09-09

CSDN每日一练 |『括号上色』『严查枪火』『数组排序』2023-09-09 一、题目名称:括号上色二、题目名称:严查枪火三、题目名称:数组排序一、题目名称:括号上色 时间限制:1000ms内存限制:256M 题目描述: 小艺酱又得到了一堆括号。 括号是严格匹配的。 现在给括号进行上色。…

Springboot整合JWT完成验证登录

目录 一、引入依赖二、JwtUtil 代码解读三、LoginController 代码解读四、整体代码五、结果展示 一、引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></depende…

趣解接口隔离原则之《做个Rapper咋这么难?》

〇、小故事 不知道大家是否看过这样一个短视频——“姐姐去找她的弟弟&#xff0c;因为她的弟弟想要当rapper而荒废了学业&#xff0c;姐姐多番劝导也没有用&#xff0c;最后一怒一下&#xff0c;把弟弟的rapper发型剃了。没有了帅气的rapper发型&#xff0c;弟弟也放弃了当ra…

数据结构与算法-选择冒泡快排计数

一&#xff1a;选择排序 场景&#xff1a;找出一个班上身高最高的人你会怎么找&#xff1f;A B C D A B 选择排序的思路和插入排序非常相似&#xff0c;也分已排序和未排序区间。但选择排序每次会从未排序区间中找到最小的元素&#xff0c;将其放到已排序区间的末尾。但是不像插…

SetWindowDisplayAffinity 函数设置窗体透明

#define WDA_NONE 0x00000000 #define WDA_MONITOR 0x00000001 #define WDA_EXCLUDEFROMCAPTURE 0x00000011 c#调用示例 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.L…

从金融史、司法体系与技术周期来看,RWA的万亿叙事经不起推敲?

加密市场走向低迷&#xff0c;但RWA&#xff08;Real World Assets&#xff0c;真实世界资产&#xff09;概念却不断升温&#xff0c;成为这个行业里为数不多各方都承认的宏大叙述&#xff0c;吸引了高盛、花旗等传统机构的兴趣。不过从金融史、司法体系与区块链技术周期等方面…

Linux基本指令及其使用

前言&#xff1a;前面我们学习了Linux环境的简单配置和XShell7的安装&#xff0c;并将云服务器部署连接到XShell本地来使用&#xff0c;今天&#xff0c;我们就一起来学习一些Linux的基本指令及其使用&#xff0c;为后续的Linux的学习打基础&#xff0c;下面&#xff0c;马上开…

openGauss学习笔记-64 openGauss 数据库管理-创建和管理表空间

文章目录 openGauss学习笔记-64 openGauss 数据库管理-创建和管理表空间64.1 背景信息64.2 注意事项64.3 操作步骤64.3.1 创建表空间64.3.2 在表空间中创建对象64.3.3 查询表空间64.3.4 查询表空间使用率64.3.5 修改表空间64.3.6 删除表空间 openGauss学习笔记-64 openGauss 数…

vite+vue3项目中集成ESLint与prettier

1. 集成eslint 1.1 安装eslint npm add -D eslint1.2 初始化ESLint配置 npx eslint --init1.3 配置初始化选择 我的选择如下&#xff1a; 安装完成后&#xff08;根目录会生成.eslintrc.js文件&#xff09; 这个配置文件是默认生成的 1.4 eslint不生效解决方案 检查vscode…

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION (论文解析)

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 摘要1 介绍2 相关工作3 重新审视 Transformers 和 DETR4 方法4.1 用于端到端目标检测的可变形transformer4.2 Deformable Detr的其他改进和变型5 实验5.1 和DETR 比较5.2 消融实验5.3 与最先进方法的…

python数据分析之Pandas库(一)

Pandas介绍 Pandas有两种常用的数据结构&#xff1a; Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;。 Series 是一种类似于一维数组的对象&#xff0c;能保存不同数据类型。 DataFrame 是一个二维的表格型的数据结构。 一、导入 i…

网络编程(一):服务器模型、Java I/O模型、Reactor事件处理模型、I/O复用

文章目录 一、Socket和TCP/IP协议族的关系二、服务器模型1.C/S模型&#xff08;Client/Server Model&#xff09;2.P2P模型&#xff08;Peer-to-Peer Model&#xff09; 三、Java的I/O演进1.BIO&#xff08;阻塞&#xff09;&#xff08;1&#xff09;工作流程&#xff08;2&am…

MATLAB实现函数拟合

目录 一.理论知识 1.拟合与插值的区别 2.几何意义 3.误差分析 二.操作实现 1.数据准备 2.使用cftool——拟合工具箱 三.函数拟合典例 四.代码扩展 一.理论知识 1.拟合与插值的区别 通俗的说&#xff0c;插值的本质是根据现有离散点的信息创建出更多的离散点&#xf…

HashMap解决哈希冲突

要了解 Hash冲突&#xff0c;那首先我们要先了解 Hash 算法和 Hash 表。 Hash算法 Hash 算法&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变成固定长度的输出&#xff0c;这个输出结果是散列值。 Hash表 Hash 表又叫做“散列表”&#xff0c;它是通…