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 控制器用来保存上传的文件。
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)后端