【SpringMVC】| 使用SpringMVC实现文件上传 | 下载功能

news2024/11/14 19:19:29

MVC目录

  • 一. 🦁 前言
  • 二. 🦁 文件上传 & 下载
    • 1. 文件上传
      • Ⅰ. 上传单个文件
      • Ⅱ. 上传多个文件
      • Ⅲ. 异步上传
      • Ⅳ. 跨服务器上传
        • 1. 添加跨服上传依赖
        • 2. 创建控制器方法
    • 2. 文件下载
  • 三. 🦁 总结

一. 🦁 前言

SpringMVC是一个Web框架,提供了许多有用的功能,包括文件上传和下载。通过SpringMVC上传和下载文件,您可以允许用户上传文件,以便将它们存储在服务器上,或者允许用户从服务器上下载文件。这些都可以为您的应用程序添加有用的功能,例如:

  1. 允许用户上传和共享文件 - 如果您的应用程序需要允许用户上传和共享文件,那么SpringMVC的文件上传功能将非常有用。

  2. 允许用户从服务器下载文件 - 如果您的应用程序需要允许用户从服务器上下载文件,那么SpringMVC的文件下载功能将非常有用。

  3. 存储和管理文件 - SpringMVC的文件上传功能还可以帮助您存储和管理用户上传的文件,例如,您可以将它们保存在数据库中或在服务器上的特定目录中。

通过使用SpringMVC的文件上传和下载功能,您可以为您的应用程序添加有用的功能,并提供更好的用户体验。
接下来一起探索一下SpringMVC上传以及下载文件的功能实现!!!

二. 🦁 文件上传 & 下载

1. 文件上传

SpringMVC使用框架提供的文件解析器对象,可以直接将请求体中的文件数据转为MultipartFile对象

tips:

分布式系统不适合使用

Ⅰ. 上传单个文件

// MultipartFile参数名必须和JSP文件空间的name属性一致
@RequestMapping("/fileUpload2")
public String upload2(MultipartFile file,HttpServletRequest request) throws IOException {
  // 创建文件夹,存放上传文件
  String realPath = request.getSession().getServletContext().getRealPath("/upload");
  File dir = new File(realPath);
  if(!dir.exists()){
    dir.mkdirs();
   }
  // 将上传的数据写到文件夹的文件中
  // 1.拿到上传的文件名
  String filename = file.getOriginalFilename();
  filename = UUID.randomUUID()+"_"+filename;
  // 2.创建空文件
  File newFile = new File(dir,filename);
  // 3.将数据写入空文件中
  file.transferTo(newFile);


  return "index";
}

Ⅱ. 上传多个文件

处理多文件上传,参数类型为MultipartFile数组,参数名和JSP文件控件的name属性一致

// 处理多文件上传,参数类型为MultipartFile数组,参数名和JSP文件控件的name属性一致
@RequestMapping("/fileUpload3")
public String upload3(MultipartFile files[],String username,HttpServletRequest request) throws Exception {
  System.out.println(username);
  //1.设置上传文件保存的文件夹
  String realPath = request.getSession().getServletContext().getRealPath("/upload");
  File dir = new File(realPath);
  if (!dir.exists()){
    dir.mkdirs();
   }
  //2.遍历数组,将上传文件保存到文件夹
  for(MultipartFile file:files){
    String filename = file.getOriginalFilename();
    filename = UUID.randomUUID()+"_"+filename;
    File newFile = new File(dir, filename);
    file.transferTo(newFile);
   }
  return "index";
}

Ⅲ. 异步上传

前两个上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:

上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。

@RequestMapping("/fileUpload4")
//不进行页面跳转
@ResponseBody
public String upload3(HttpServletRequest request, MultipartFile file) throws Exception {
  // 创建文件夹,存放上传文件。
  String realPath = request.getSession().getServletContext().getRealPath("/upload");
  File dir = new File(realPath);
  if (!dir.exists()){
    dir.mkdirs();
   }
  // 拿到上传文件名
  String filename = file.getOriginalFilename();
  filename = UUID.randomUUID()+"_"+filename;
  // 创建空文件
  File newFile = new File(dir, filename);
  // 将上传的文件写到空文件中
  file.transferTo(newFile);
  // 返回文件的路径
  return "/upload/"+filename;
}

Ⅳ. 跨服务器上传

image-20230415094203882

tips:

如果是以tomcat作为图片服务器:

  1. 需要在tomcat的webapps下创建upload目录作为文件上传目录。
  2. 修改tomcat的 conf/web.xml 文件,支持跨服上传。
  3. 修改tomcat的 conf/server.xml 文件,修改tomcat端口,修改完开启tomcat服务器

image-20230415095425307

1. 添加跨服上传依赖

<!-- 跨服上传 -->
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-core</artifactId>
  <version>1.18.1</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>

2. 创建控制器方法

该方法在接受到上传请求后将文件保存到其他服务器上。

@RequestMapping("/fileUpload5")
@ResponseBody
public String upload4(HttpServletRequest request, MultipartFile file) throws Exception {
  // 设置跨服上传的服务器路径
  String path = "http://localhost:8081/upload/";
  // 获取上传的文件名
  String filename = file.getOriginalFilename();
  filename = UUID.randomUUID()+"_"+filename;
  // 跨服上传:
  // 1.创建客户端对象
  Client client = Client.create();
  // 2.使用客户端对象连接图片服务器
  WebResource resource = client.resource(path + filename);
  //3.传输数据
  resource.put(file.getBytes());
  return path+filename;
}

2. 文件下载

xiazai

// 文件下载
@RequestMapping("/download")
public void fileDown(HttpServletRequest request, HttpServletResponse response,String fileName) throws IOException {
  // 设置响应头
  response.setHeader("Content-Disposition","attachment;filename="+fileName);
  // 获取文件路径
  String path = request.getSession().getServletContext().getRealPath("/upload");
  File file = new File(path,fileName);
  // 获取字节输出流
  ServletOutputStream os = response.getOutputStream();
  // 使用输出流写出文件
  os.write(FileUtils.readFileToByteArray(file));
  os.flush();
  os.close();
}

三. 🦁 总结

到了文章的尾声,咱们这一期的分享结束,下期见!!!

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

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

相关文章

Qt的UI入门

二、UI入门 1. QWidget类 QWidget类是Qt中所有组件和窗口的基类&#xff0c;其内部规定了组件和窗口的基本规则和功能。 Qt中每个属性的文档中都有Access functions部分&#xff0c;表示其支持的读写&#xff08;getter和setter&#xff09;函数&#xff0c;Qt中的getter和sett…

Redis实现延迟队列方法介绍

延迟队列&#xff0c;顾名思义它是一种带有延迟功能的消息队列。那么&#xff0c;是在什么场景下我才需要这样的队列呢&#xff1f; 1. 背景 我们先看看以下业务场景&#xff1a; 当订单一直处于未支付状态时&#xff0c;如何及时的关闭订单如何定期检查处于退款状态的订单是…

神秘的IP地址8.8.8.8地址到底是什么?为什么会被用作DNS服务器地址呢?

当我们在配置网络连接或者路由器时&#xff0c;经常会遇到需要填写DNS服务器地址的情况。而在这些情况下&#xff0c;很多人都会听到一个神秘的数字地址&#xff1a;8.8.8.8。那么&#xff0c;这个地址到底是什么&#xff0c;为什么会被用作DNS服务器地址呢&#xff1f;本文将详…

分流稳压器TL431/TLV431

分流稳压器&#xff08;Shunt Regulator&#xff09;指的是依靠调节Ik电流来稳定输出电压&#xff0c;分流指的就是Ik来分流。 分流稳压器&#xff0c;也叫做并联电压稳压器&#xff0c;相对地&#xff0c;还有串联电压稳压器。 1、常见型号 TL431TLV431Vref2.5V1.24VVoutVref…

作为一个java工程师,你还记得java的基本数据类型有那些吗?他们的取值范围是多少?

Java是一种强类型编程语言&#xff0c;因此所有的变量都必须先声明后使用。Java基本数据类型指的是Java语言中最基本的数据类型&#xff0c;包括整型、浮点型、字符型、布尔型等。 Java基本数据类型一共有8种&#xff0c;它们分别是&#xff1a; byte&#xff08;字节型&#…

SpringCloud高频面试题--附答案

今天给大家分享SpringCloud高频面试题。下面是一张Spring Cloud核心组件关系图&#xff1a; 从这张图中&#xff0c;其实我们是可以获取很多信息的&#xff0c;希望大家细细品尝。 话不多说&#xff0c;直接开始面试&#xff0c;你准备好了吗&#xff1f; 1、什么是Spring Cl…

汽车电路图、原理框图、线束图、元器件布置图的识读技巧与要点

摘要&#xff1a; 想要读懂汽车电路图就必须把电的通路理清楚&#xff0c;即某条线是什么信号&#xff0c;该信号是输入信号、输出信号还是控制信号以及信号起什么作用&#xff0c;在什么条件下有信号&#xff0c;从哪里来&#xff0c;到哪里去。 一、汽车电路图的识读技巧 1.…

【Python习题集3】常用数据结构习题

数据结构 一、实验内容二、实验总结 一、实验内容 1.从键盘输入一个正整数列表&#xff0c;以-1结束&#xff0c;分别计算列表中奇数和偶数的和。 &#xff08;1&#xff09;源代码 n int(input("请输入一个正整数&#xff1a;")) list3 [] while n ! -1:list3.a…

【云原生|Kubernetes】02-Kubeadm安装部署Kubernetes集群

【云原生|Kubernetes】02-Kubeadm安装部署Kubernetes集群 文章目录 【云原生|Kubernetes】02-Kubeadm安装部署Kubernetes集群前言环境介绍安装kubernetes集群基础环境设置安装Kubernetes集群安装kubeadm&#xff0c;kubectl&#xff0c;kubeletkubeadm初始化集群(master节点操作…

C语言-学习之路-05

C语言-学习之路-05 函数函数分类函数的作用 函数的定义函数定义格式 函数名字、形参、函数体、返回值函数调用无参函数调用有参函数调用 函数的声明多文件&#xff08;分文件&#xff09;编程分文件编程 函数 函数分类 C语言程序都是从主函数main()开始执行的。从函数的定义角…

259页11万字智慧水利建设项目解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1.1.1 项目建设任务 依托省政务云平台&#xff1b;建立水利专业数据的汇集、共享、交换和水利数据库、数据仓库、数据资源目录与大数据服务等&#xff1b;建立水利大数据分…

OpenGL(五)——变换

目录 一、前言 二、向量 三、矩阵 四、旋转的箱子 4.1 GLM库 4.2 构建 一、前言 前面了解渲染架构中uniform可以传递矩阵变换&#xff0c;如从RGBA到YUV&#xff0c;同时它也可以使物体通过矩阵变换动起来。 二、向量 向量是包含方向和大小的矢量&#xff0c;平面2D坐标可…

一文吃透Tomcat核心知识点

架构 首先&#xff0c;看一下整个架构图。最全面的Java面试网站 接下来简单解释一下。 Server&#xff1a;服务器。Tomcat 就是一个 Server 服务器。 Service&#xff1a;在服务器中可以有多个 Service&#xff0c;只不过在我们常用的这套 Catalina 容器的Tomcat 中只包含一…

在技术圈超卷的当下,学历到底是敲门砖还是枷锁?

前言 最近&#xff0c;突然之间被“孔乙己文学”刷屏了&#xff0c;短时间内“孔乙己文学”迅速走红&#xff0c;孔乙己是中国文学中的一位经典人物&#xff0c;他的长衫被认为是他的象征之一&#xff0c;孔乙己的长衫折射出很多现象&#xff0c;既有社会的&#xff0c;也有教育…

【Linux】进程信号及信号产生

文章目录 一. 生活层面的信号二. 进程信号三. 硬件中断四. 信号产生五. Term&Core1. 核心转储的意义2. 云服务器为什么关闭核心转储3. core dump标志 六. 总结结束语 一. 生活层面的信号 在学习进程信号前&#xff0c;我们不妨认识一下现实中有哪些信号。 日常生活中&#…

净利润下滑13%,帅丰电器已掉队?

近年来&#xff0c;随着市场竞争加剧&#xff0c;厨电行业加速洗牌&#xff0c;超60%杂牌或被淘汰出局&#xff0c;三类品牌全部被清退。而作为毛利最高的厨电细分市场&#xff0c;集成灶行业吸引了大批企业涌入&#xff0c;市场渗透率快速提升&#xff0c;已经超过30%&#xf…

如何入门数据分析

如何入门数据分析&#xff1f; 随着数字经济、大数据时代的发展&#xff0c;数据已然成为当下时代最重要的盈利资源&#xff0c;让企业在做决策和计划方案时更有针对性和依据&#xff0c;能提前预测市场发展方向&#xff0c;做好布局。由此而产生的数据分析岗位也逐渐被更多企业…

亚马逊、Lazada、阿里国际、eBay、Temu、Ozon好消息不断,机会来了

1. 亚马逊第一季度营收1273.58亿美元 同比扭亏为盈 亚马逊2023财年第一季度财报。亚马逊第一季度净销售额为1273.58亿美元&#xff0c;与上年同期的1164.44亿美元相比增长9%&#xff0c;不计入汇率变动的影响为同比增长11%&#xff1b;净利润为31.72亿美元&#xff0c;上年同期…

“智慧交通”转型升级+创新发展策略

随着“互联网交通”的应用创新推陈出新&#xff0c;传统轨道交通行业客户服务中心已难以满足乘客对便捷高效的客户服务需求&#xff1b;节假日人流量激增&#xff0c;客户服务人手不足&#xff0c;交通、站点堵塞、信息更新不及时等问题是常态。因此&#xff0c;“智慧城市”交…

多租户SAAS系统涉及实战解决方案—案例JeecgBoot低代码平台

JeecgBoot免费低代码平台&#xff0c;提供一键切换多租户模式机制&#xff01;快速实现全系统的saas租户方案&#xff0c;通过租户ID进行数据隔离。 租户设计思路 1、开启全系统租户隔离 开启方法 将 org.jeecg.config.mybatis.MybatisPlusSaasConfig#OPEN_SYSTEM_TENANT_CO…