当前位置: 首页 > news >正文

基于SpringBoot实现SpringMvc上传下载功能实现

SpringMvc上传下载功能实现

1.创建新的项目

1)项目信息填写

  1. Spring Initializr (单击选中)
  2. Name(填写项目名字)
  3. Language(选择开发语言)
  4. Type(选择工具Maven)
  5. Group()
  6. JDK(jdk选择17 )
  7. Next(下一步)

2)选择所用的包

  1. Springboot (选择SpringBoot版本)
  2. 输入(web)
  3. 选择Spring Web
  4. 选择Thymeleaf
  5. create

3)创建controller包 

4)创建DownLoadController类

package com.xiji.springdemo01.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class DownLoadController {@RequestMapping("/")public String index(){return "index";}}

5)创建UpLoadController类

package com.xiji.springdemo01.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** 文件上传功能*/
@Controller
public class UpLoadController {@RequestMapping("/up")public String uploadPage(){return "upload";}
}

在resources文件的static创建img文件夹===》导入图片

打开templates文件夹

6)创建index.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>精美主页面</title><style>/* styles.css */body {font-family: Arial, sans-serif;margin: 0;padding: 0;background-color: #f4f4f4;}header {background-color: #333;color: white;padding: 10px 0;text-align: center;}nav ul {list-style-type: none;padding: 0;}nav ul li {display: inline;margin-right: 10px;}nav ul li a {color: white;text-decoration: none;}main {padding: 20px;background-color: white;margin: 20px;}section {margin-bottom: 20px;}footer {background-color: #333;color: white;text-align: center;padding: 10px 0;position: fixed;width: 100%;bottom: 0;}</style>
</head>
<body>
<header><nav><ul><li><a href="#home">首页</a></li><li><a href="#services">服务</a></li><li><a href="#about">关于我们</a></li><li><a href="#contact">联系我们</a></li></ul></nav>
</header>
<main><di style="width: 200px;height: 200px;"> <a th:href="@{/download}">文件下载</a></di></main>
<footer><p>版权所有 © 2023 我们的公司</p>
</footer>
</body>
</html>

注:<a th:href="@{/download}">文件下载</a> 这个路径对应的是后端的下载接口

7)创建upload.html

<!DOCTYPE html>
<html lang="zh-CN" >
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"><style>body {font-family: 'Arial', sans-serif;background-color: #f4f4f9;margin: 0;padding: 0;}.container {max-width: 600px;margin: 50px auto;padding: 20px;background-color: #fff;border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}h1 {text-align: center;color: #333;}.form-group {margin-bottom: 20px;}.btn-primary {width: 100%;}.custom-file-input ~ .custom-file-label {background-color: #e9ecef;border-color: #ced4da;}.custom-file-input:focus ~ .custom-file-label {border-color: #80bdff;box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);}</style>
</head>
<body>
<div class="container"><h1>文件上传</h1><form id="uploadForm" method="post" action="http://127.0.0.1:8080/upload" enctype="multipart/form-data"><div class="form-group"><label for="fileInput">选择文件:</label><input type="file" class="form-control-file" id="fileInput" name="fileInput"></div><button type="submit" class="btn btn-primary">上传文件</button></form>
</div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script></script>
</body>
</html>j

注:<input type="file" class="form-control-file" id="fileInput" name="fileInput">

                                                                                        name值与接口值一致

解释

  1. form 元素创建了一个表单,其属性包括:
    1.  id 设置为 "uploadForm",可以在JavaScript中引用此表单。
    2. method 设置为 "post",表示数据将通过POST方法提交到服务器。
    3. action 指定了接收上传文件的服务器端脚本地址。
    4. enctype 设置为 "multipart/form-data",这是必须的,因为它允许表单发送二进制文件数据(如图片或文档)。       
  2. input 类型为 "file",允许用户从本地文件系统选择一个或多个文件进行上传。
  3. 最后,一个带有类 "btn btn-primary" 的按钮用于提交表单。

2.实现上传功能

1)关键代码

/*** 通过MultipartFile实现上传*/
@RequestMapping("/upload")
@ResponseBody
public String upload(MultipartFile fileInput) throws IOException {PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();//获取上传文件夹的路径资源Resource resource = resolver.getResource("classpath:static/img/"); //获取文件夹真实路径String path = resource.getFile().getPath();//路径拼接String filePath = path + File.separator + fileInput.getOriginalFilename();//通过transferTo()方法返回给前端fileInput.transferTo(new File(filePath));return "上传成功";}

2)详情解释

  • 注解说明:
    •  @RequestMapping("/upload"): 定义了处理 HTTP 请求的 URL 映射。
    • @ResponseBody: 表示该方法返回的内容将直接作为 HTTP 响应体返回给客户端。
  • 接收上传文件:
    • MultipartFile fileInput: 用于接收上传的文件。
  • 获取文件夹路径:
    • PathMatchingResourcePatternResolver resolver: 用于解析文件资源路径。
    • resolver.getResource("classpath:static/img/"): 获取指定路径下的文件夹资源。
    • String path = resource.getFile().getPath();: 获取文件夹的真实路径。
  • 拼接文件路径:
    • String filePath = path + File.separator + fileInput.getOriginalFilename();: 拼接完整的文件路径。
  • 保存文件:
    • fileInput.transferTo(new File(filePath));: 将上传的文件保存到指定路径。
  • 返回结果:
    • return "上传成功";: 返回上传成功的消息。

3)功能测试

打开 http://127.0.0.1:8080/up

http://127.0.0.1:8080/up

任选一张图片

打开idea ===> target ==> classes ===> static ==> img ==>看到已经成功上传到服务器

可以看到已经上传成功了

       

3.文件下载功能实现

1)关键代码

/**** 通过PathMatchingResourcePatternResolver + ResponseEntity 下载文件*/
@RequestMapping("/download")
@ResponseBody
public ResponseEntity<byte[]> download() throws IOException {//获取文件地址 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource resource = resolver.getResource("static/img/1.png");​​​​​​​        ​​​​​​​        ​​​​​​​        // 1.png修改为你导入的图片名称//获取文件File file = resource.getFile(); //获取文件流FileInputStream fileInputStream = new FileInputStream(file);//创建每次读取的字节数为文件本身大小byte[] bytes = new byte[fileInputStream.available()];//相当于把文件流 输入到  bytes 字节数组中fileInputStream.read(bytes);//设置下载方式HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("Content-Disposition", "attachment; filename=" + file.getName());//状态码设置HttpStatus ok = HttpStatus.OK;//创建ResponseEntity返回给前端ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, ok);return responseEntity;
}

2)详细解释

  • 注解说明:
    •  @RequestMapping("/download"): 定义了处理 HTTP 请求的 URL 映射。
    • @ResponseBody: 表示该方法返回的内容将直接作为 HTTP 响应体返回给客户端。
  • 文件资源解析:
    • PathMatchingResourcePatternResolver: 用于解析文件资源路径。
    •  getResource("static/img/1.png"): 获取指定路径下的文件资源。
  • 文件对象获取:
    • File file = resource.getFile();: 将资源转换为 File 对象。
  • 设置响应头:
    •  HttpHeaders httpHeaders: 创建响应头对象。
    •  httpHeaders.add("Content-Disposition", "attachment; filename=" + file.getName()): 设置响应头,指定文件以附件形式下载,并设置文件名。
  • 状态码设置:
    • HttpStatus ok = HttpStatus.OK: 设置 HTTP 状态码为 200 OK。
  • 读取文件内容:
    •  FileInputStream fileInputStream = new FileInputStream(file);: 创建文件输入流。
    • byte[] bytes = new byte[fileInputStream.available()];: 创建字节数组。
    •  fileInputStream.read(bytes);: 读取文件内容到字节数组中。
  • 创建响应实体:
    •  ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, ok);:
    • 创建 ResponseEntity 对象,包含文件内容、响应头和状态码。
  • 返回响应:
    • return responseEntity;: 返回响应实体。

3)功能测试

打开网址 打开网址打开网址  http://127.0.0.1:8080/打开网址 



        
       

可以看到我们已经下载成功了

4.附:

1)完整的DownLoadController 类代码

package com.xiji.springdemo01.controller;import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;@Controller
public class DownLoadController {/**** 通过PathMatchingResourcePatternResolver + ResponseEntity 下载文件*/@RequestMapping("/download")@ResponseBodypublic ResponseEntity<byte[]> download() throws IOException {//获取文件地址PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource resource = resolver.getResource("static/img/1.png");//获取文件File file = resource.getFile();//获取文件流FileInputStream fileInputStream = new FileInputStream(file);//创建每次读取的字节数为文件本身大小byte[] bytes = new byte[fileInputStream.available()];//相当于把文件流 输入到  bytes 字节数组中fileInputStream.read(bytes);//设置下载方式HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("Content-Disposition", "attachment; filename=" + file.getName());//状态码设置HttpStatus ok = HttpStatus.OK;ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, ok);return responseEntity;}@RequestMapping("/")public String index(){return "index";}}

2)完整的UpLoadController 代码

package com.xiji.springdemo01.controller;import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;/*** 文件上传功能*/
@Controller
public class UpLoadController {/*** 通过MultipartFile实现上传*/@RequestMapping("/upload")@ResponseBodypublic String upload(MultipartFile fileInput) throws IOException {PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource resource = resolver.getResource("classpath:static/img/");String path = resource.getFile().getPath();//路径拼接String filePath = path + File.separator + fileInput.getOriginalFilename();fileInput.transferTo(new File(filePath));return "上传成功";}@RequestMapping("/up")public String uploadPage(){return "upload";}
}



        

       
       



        

       
        
       

                

        

相关文章:

基于SpringBoot实现SpringMvc上传下载功能实现

SpringMvc上传下载功能实现 1.创建新的项目 1&#xff09;项目信息填写 Spring Initializr (单击选中)Name(填写项目名字)Language&#xff08;选择开发语言&#xff09;Type&#xff08;选择工具Maven&#xff09;Group&#xff08;&#xff09;JDK&#xff08;jdk选择17 &…...

vue 控制组件是否显示

在Vue中&#xff0c;控制组件的显示通常使用v-if、v-else-if、v-else或v-show指令。 1.v-if&#xff1a;条件性地渲染元素&#xff0c;如果条件为假&#xff0c;元素甚至不会被渲染到DOM中。 <template><div><MyComponent v-if"showMyComponent" /&…...

生产部门不给力?精益化生产管理咨询公司为您出谋划策

问题背景 近年来&#xff0c;许多企业的生产部门面临着各种挑战和困难。生产效率低下、产品质量不稳定、生产成本过高等问题频频出现&#xff0c;给企业的发展带来了困扰。面对这一现状&#xff0c;许多企业开始寻求专业的管理咨询公司的帮助&#xff0c;以期能够通过精益生产…...

HTML+CSS - 网页布局之网格布局

1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为&#xff0c;包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一&#xff0c;在文档中创建类似于网格的效果&…...

基于51单片机的16X16点阵显示屏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1JQ225NSKweqf1Zlad_f1Mw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…...

【目标检测数据集】厨房常见的水果蔬菜调味料数据集4910张39类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4910 标注数量(xml文件个数)&#xff1a;4910 标注数量(txt文件个数)&#xff1a;4910 标注…...

在Python中统计字符串中每个字符出现的次数

在Python中统计字符串中每个字符出现的次数 在Python编程中,处理字符串是一个常见的任务。统计字符串中每个字符出现的次数不仅能考察候选人的编程能力,还能展示他们对Python内置数据结构和算法的理解。本文将详细介绍如何编写一个函数来统计字符串中每个字符出现的次数,并…...

关于 vue/cli 脚手架实现项目编译运行的源码解析

1.vue项目运行命令解析 在日常开发中&#xff0c;vue 项目通过vue-cli-service脚手架包将项目运行起来&#xff0c;常用的命令例如&#xff1a; npm run serve npm run build 上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令&#xff0c;在…...

C++笔记---继承(上)

1. 继承的简单介绍 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上进行扩展&#xff0c;增加方法(成员函数)和属性(成员变量)&#xff0c;这样产生新的类&#xff0c;称派生类。 继承呈…...

气膜体育馆:为学校打造智能化运动空间—轻空间

随着教育体制的逐步升级&#xff0c;学校在提升学生综合素质方面的需求日益增长&#xff0c;特别是在体育场地方面。气膜体育馆作为一种新型的运动空间形式&#xff0c;正在迅速成为学校体育设施的优选方案。凭借其快速搭建、节能环保等优势&#xff0c;气膜馆在全国各地的校园…...

JVM 调优篇5 jvm性能监控

一 jvm性能监控 1.1 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。 体会1&#xff1a;使用数据说明问题&#xff0c;使用知识分析问题&#xff0c;使用工具处理问…...

一. Unity实现虚拟摇杆及屏幕自适应功能

手游里面很多类型的游戏都需要用到遥感功能&#xff0c;例如王者荣耀&#xff0c;和平精英等&#xff0c;之前的摇杆功能都是用类似于Easy Touch的插件进行开发的&#xff0c;今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成&#xff0c…...

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异

测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint&#xff08;1&#xff09;的用法来实现存储0 1 作为boolean的标识列&#xff1b;但是在达梦并不允许使用 tinyint&#xff08;1&#xff09;来定义列&#xff0c;只能使用 tinyint 即 取值范围为&#xff…...

VUE工程中axios基本使用

安装axios npm install axios -s在main.js中引入 import http from axios Vue.prototype.$http = http将其绑定在VUE的prototype属性中 vue工程目录下,新建config文件夹,在config文件夹下新建index.js export default {...

跨服务器执行PowerShell脚本

本机和远程机都要执行 Enable-PSRemoting -Force 远程端关闭公用网络 Get-NetConnectionProfile Set-NetConnectionProfile -Name "未识别的网络" -NetworkCategory Private 本机和远程机都要执行 winrm quickconfig 将远程机ip加入信任列表 cd WSMan::localhost\…...

linux_L2_linux删除文件

linux 删除文件 在Linux下删除文件有多种实现方法&#xff0c;以下是其中几种常见的方法&#xff1a; 方法一&#xff1a;使用rm命令删除单个文件 rm 文件路径例如&#xff0c;删除当前目录下的文件file.txt&#xff1a; rm file.txtQuestion :当你在Linux系统中使用rm命令删…...

系统架构设计师 - 项目管理

项目管理 项目管理&#xff08;1-3分&#xff0c;案例分析 25分&#xff09;立项管理 ★盈亏平衡分析 范围管理 ★★时间管理 ★★★★概述前导图法 PDM(单代号网络图)箭线图法 ADM(双代号网络图) 了解关键路径法总时差自由时差 甘特图 成本管理 ★挣值管理概述指数计算 软件质…...

Spring Boot基础

项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController&#xff1a;这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回&#xff0c;主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…...

C语言 | Leetcode C语言题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; char* removeKdigits(char* num, int k) {int n strlen(num), top 0;char* stk malloc(sizeof(char) * (n 1));for (int i 0; i < n; i) {while (top > 0 && stk[top] > num[i] && k) {top--, k--;}stk[top]…...

使用Visual Studio Code配置C/C++开发环境的全面指南

目录 引言 一、准备工作 1. 安装Visual Studio Code 2. 安装C/C编译器 3. 配置环境变量&#xff08;仅Windows用户&#xff09; 二、在VS Code中安装C/C扩展 三、创建您的第一个C/C项目 1. 创建项目文件夹 2. 打开项目文件夹 3. 创建源文件 四、配置任务&#xff08;…...

算法练习题26——多项式输出(模拟)

输入格式 输入共有 2 行 第一行 1 个整数&#xff0c;n&#xff0c;表示一元多项式的次数。 第二行有 n1 个整数&#xff0c;其中第 i 个整数表示第 n−i1 次项的系数&#xff0c;每两个整数之间用空格隔开。 输出格式 输出共 1 行&#xff0c;按题目所述格式输出多项式。…...

卷积神经网络经典模型架构简介

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 《PyTorch深度学习与企业级项目实战&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;宋立林)【摘要 书评 试读】- 京东图书 (jd.com) ImageNet是一个包含超过1 500万幅手工标记的高分辨率图像的数据…...

【Kubernetes】常见面试题汇总(十三)

目录 39.简述 Kubernetes Scheduler 使用哪两种算法将 Pod 绑定到 worker 节点&#xff1f; 40.简述 Kubernetes kubelet 的作用&#xff1f; 41.简述 Kubernetes kubelet 监控 Worker 节点资源是使用什么组件来实现的&#xff1f; 39.简述 Kubernetes Scheduler 使用哪两种算…...

嵌入式QT开发:构建高效智能的嵌入式系统

摘要&#xff1a; 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发&#xff0c;详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程&#xff0c;包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面…...

Linux抢占调度

目录 抢占流程 抢占时机 用户态抢占时机 1、 从系统调用返回用户空间 2、 从中断返回用户空间 内核态抢占时机 1、中断处理程序返回内核空间 可以看到最终是到了 preempt_schedule_irq 2、当内核从non-preemptible&#xff08;禁止抢占&#xff09;状态变成pr…...

k8s中,为什么把pod的服务以deployment的形式通过nodeport对外发布,以及容器和虚拟机的一些区别

deployment是个控制器 主要负责管理pod&#xff0c;来代表k8s集群向外提供稳定的服务。 说&#xff0c;k8s有很多优点。 说k8s的优点&#xff0c;可能先需要说容器提供的便利。 同样的硬件资源 跑几个虚拟机&#xff0c;每个虚拟机上跑几个服务。 就挺重了。风扇呼呼叫 …...

PMP--一模--解题--41-50

文章目录 14.敏捷--方法--回顾--回顾是最重要的一个实践&#xff0c;原因是它能让团队学习、改进和调整其过程。41、 [单选] 新项目中的所有团队成员都希望通过尽快交付价值来获得客户的信任。项目经理了解到一个资源已经在其他项目中与发起人一起工作。某资源似乎在使用个人影…...

Kafka启动关闭及其相关命令kafka启动、状态监控、日常操作

开启zookeeper命令(备注:先进入zookeeper的bin目录) ./zkServer.sh start 关闭zookeeper命令(备注:先进入zookeeper的bin目录) ./zkServer.sh stop Kafka启动命令(备注:先进入kafka目录) 常规模式启动kafka bin/kafka-server-start.sh config/server.properties 进程守…...

CentOS 系统设置与维护教程

CentOS 系统设置与维护教程 在这篇博客中&#xff0c;我们将介绍在 CentOS 系统上进行的一些常见操作&#xff0c;包括停止和禁用防火墙服务、配置 SELinux。我们还将展示如何切换到 root 用户以执行这些操作。通过这些操作&#xff0c;你可以更好地管理和配置你的 CentOS 环境…...

流量牵引技术与传统防火墙的区别

在网络安全领域&#xff0c;流量牵引技术和传统防火墙都起着重要的作用&#xff0c;但它们在很多方面存在着明显的区别。 一、工作原理不同 传统防火墙主要是通过设置访问控制规则来过滤网络流量。它基于预先设定的策略&#xff0c;对进入和离开网络的数据包进行检查&#xf…...