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

Java高级 | 【实验六】Springboot文件上传和下载

隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客

系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客

                  Java高级 | 【实验二】Springboot 控制器类+相关注解知识-CSDN博客

                  Java高级 | 【实验三】Springboot 静态资源访问-CSDN博客

                  Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据-CSDN博客

                  Java高级 | 【实验五】Spring boot+mybatis操作数据库-CSDN博客

目录

一、实现步骤

1、配置文件上传位置和大小限制

2、创建文件上传表单页面

3、处理文件上传请求

4、提供文件下载接口

二、单文件上传

1、创建spring boot项目

2、修改文件上传的大小限制

3、创建前端页面

4、编写控制器

5、测试

(1)运行前端

(2)后端

三、多文件上传

1、在FileUpLoad类中增加如下方法

2、在FileController类中增加如下方法

3、在templates下创建一个名为“multFileUpload.html”的文件

4、测试

(1)前端 

 (2)后端

       文件上传是web开发中最常见的功能之一,比如用户注册时需要上传头像,添加上商品信息时需要上传图片等信息。

Spring Boot中文件上传非常简单,通常使用Spring MVC的MultipartFile类来处理文件上传。

一、实现步骤

Spring Boot中实现文件上传和下载通常遵循以下步骤:

1、配置文件上传位置和大小限制

首先,需要在Spring Boot应用的配置文件(如application.properties)中配置文件上传的位置和大小限制。

2、创建文件上传表单页面

 在前端创建一个包含文件上传表单的页面,通常使用HTML和表单标签来实现。表单中必须有一个input标签的type属性为file,用户通过这个输入框选择要上传的文件。

3、处理文件上传请求

在后端创建一个Controller来处理文件上传请求。这个Controller需要能够接收上传的文件,并将文件保存到指定的位置。在Spring Boot中,通常使用@RequestParam注解来接收MultipartFile对象,然后使用其transferTo()方法将文件保存到目标位置。

4、提供文件下载接口

创建另一个Controller来处理文件下载请求。这个Controller需要能够根据文件名或其他标识符找到对应的文件,并将其内容以流的形式返回给客户端。在Spring Boot中,你可以使用ResponseEntity来封装文件的响应,并设置适当的HTTP头部,使浏览器能够下载文件。

二、单文件上传

功能需求:

前端上传文件、文件名称和文件描述等相关信息。

后端获得前端上传的文件信息,并重新命名(新文件名称唯一)后保存到服务器指定的位置。

1、创建spring boot项目

如果新建项目, 注意勾选thymeleaf

这里直接使用实验一项目“springbootdemo1”,但要确保pom.xml文件中包含了Thymeleaf的依赖

//pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

2、修改文件上传的大小限制

在application.properties文件输入如下代码:

spring.application.name=springbootdemo1
#file size
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

3、创建前端页面

本项目的前端页面采用thymeleaf

在resources->templates文件夹中创建一个名为upload.html的文件。

upload.html文件的代码如下所示:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form method="POST" enctype="multipart/form-data" action="/upfile/upload">名称:<input type="text" name="title"/><br>描述:<input type="text" name="description"><br>文件:<input type="file" name="file"/><input type="submit" value="上传文件"/>
</form>
</body>
</html>

注意:确保upload.htm保存时使用的是UTF-8编码。如果文件保存时使用了其他编码(如GBK),可能会导致乱码。

4、编写控制器

本功能有两个控制器,FileController控制器用来运行前端,FileUpLoad 控制器用来保存上传的文件。

FileController控制器主要是控制前端页面:

package controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("test")
public class FileController {@RequestMapping("file")public String test1() {return "upload";}
}

FileUpLoad控制去主要是获得前端上传文件的相关信息,修改文件的名称,保存文件到指定的位置。

package controller;import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@RestController
@RequestMapping("upfile")
public class FileUpLoad {@PostMapping("/upload")public String handleFileUpload(@RequestParam("title") String title,@RequestParam("description") String description,@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {System.out.println(title+" : "+description);System.out.println(file.getOriginalFilename());//获得文件扩展名String originalFilename = file.getOriginalFilename();String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));System.out.println("扩展名:"+fileType);//如果上传的文件为空if (file.isEmpty()) {return "Please select a file to upload.";}//获得动态的路径String path=request.getServletContext().getRealPath("/upload/");System.out.println(path);saveFile(file,path,fileType);return "文件上传成功!";}private void saveFile(MultipartFile file, String path,String fileType) throws IOException {//上传文件名重新命名,唯一,防止重复String originalFilename = file.getOriginalFilename();String newFilename = UUID.randomUUID().toString() + fileType;//新文件对象File dest = new File(path+ newFilename);//判断文件存放的目录,如果不存在就创建文件存放的目录。File dir=new File(path);if(!dir.exists()){dir.mkdir();}//文件上传file.transferTo(dest);}
}

启动spring boot项目。

5、测试

(1)运行前端

在浏览器的url中输入http://localhost:8080/test/file,回车,输入上传文件的相关信息后点击上传文件。

(2)后端

Springboot的控制台输出的相关信息

文件保存的位置:

C:\Users\xx\AppData\Local\Temp\tomcat-docbase.8080.2289647245401549388\upload\

文件浏览:

三、多文件上传

1、在FileUpLoad类中增加如下方法

@PostMapping("/multiFileUpload")public String MultipartFileUpload(@RequestParam("title") String title,@RequestParam("description") String description,@RequestPart("one") MultipartFile mf,@RequestPart("any") MultipartFile[] mfs,HttpServletRequest request) throws IOException{System.out.println("单文件上传信息为:"+mf.getOriginalFilename());System.out.println("多文件个数:"+mfs.length);for (MultipartFile m:mfs){System.out.println("多文件信息:文件名称:"+m.getOriginalFilename()+",文件大小:"+m.getSize()/1000+"kb");}/*将文件上传到指定文件夹*/if (!mf.isEmpty()){String fileName=mf.getOriginalFilename();//文件上传mf.transferTo(new File("E:\\upload"+fileName));}if (mfs.length>0){for (MultipartFile m: mfs) {m.transferTo(new File("E:\\multi_upload"+m.getOriginalFilename()));}}return "成功";}

2、在FileController类中增加如下方法

@RequestMapping("multi_file")public String test2() {return "multFileUpload";}

3、在templates下创建一个名为“multFileUpload.html”的文件

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form method="POST" enctype="multipart/form-data" action="/upfile/multiFileUpload">名称:<input type="text" name="title"/><br>描述:<input type="text" name="description"><br>单个文件: <input type="file" value="上传单个文件" name="one" ><p>多个文件 <input type="file" value="上传多个文件" name="any"  multiple><p><input type="submit" value="上传文件"/>
</form>
</body>
</html>

4、测试

测试路径:http://localhost:8080/test/multi_file 

(1)前端 

 

 (2)后端

 

http://www.lryc.cn/news/2404953.html

相关文章:

  • RKNN开发环境搭建1-基于Ubuntu 18.04系统使用Docker安装rknn-toolkit2
  • qt使用笔记二:main.cpp详解
  • VBA进度条ProgressForm1
  • 行为型设计模式之Interpreter(解释器)
  • 深入解析 CAS 操作
  • vue3+TS+eslint9配置
  • 【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)
  • HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命​
  • 【Dv3Admin】系统视图字典管理API文件解析
  • 免费 SecureCRT8.3下载、安装、注册、使用与设置
  • Redis :String类型
  • 两种Https正向代理的实现原理
  • 第18节 Node.js Web 模块
  • 网络爬虫一课一得
  • LeetCode--24.两两交换链表中的结点
  • 嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用
  • IDEA集成JRebel插件,实现实时热部署
  • 1-3 Linux-虚拟机(2025.6.7学习篇- mac版本)
  • 如何打造一款金融推理工具Financial Reasoning Workflow:WebUI+Ollama+Fin-R1+MCP/RAG
  • mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因
  • 【试卷篇】Spring面试试卷题
  • 通过阿里云 DashScope API 调用通义千问
  • Go 中 map 的双值检测写法详解
  • 大故障:阿里云核心域名爆炸了
  • 解决Zotero翻译插件Zotero PDF Translate无法正常翻译
  • 【Latex】Windows/Ubuntu 绘制 eps 矢量图通用方法(drawio),支持插入 Latex 数学公式
  • Vue---vue使用AOS(滚动动画)库
  • 十(1). 强制类型转换
  • 从npm库 Vue 组件到独立SDK:打包与 CDN 引入的最佳实践
  • rknn优化教程(一)