下面我将详细讲解“Spring Boot + Thymeleaf 实现文件上传下载功能”的完整攻略。
准备工作
在开始前,请确保你已经具备以下环境:
- JDK1.8及以上
- Maven 3.0及以上
项目搭建
- 建立一个 Spring Boot 项目
可以通过 Spring Initializr 快速搭建,选择 Web 依赖和 Thymeleaf 模板引擎即可。
- 引入依赖
在 pom.xml 中引入文件上传下载所需的依赖:
<!-- 文件上传 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 文件下载 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
- 编写上传文件页面
在 templates 文件夹下新建 upload.html 文件,并编写上传文件页面的 html 代码,以下是一个简单示例:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<h2>文件上传</h2>
<!–- enctype="multipart/form-data" 必须加上,否则无法上传文件 -–>
<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<br/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
- 新建 Controller
在 controller 包下新建 UploadController.java 文件,并编写文件上传和下载的代码。
@Controller
public class UploadController {
//上传文件页面
@GetMapping("/upload")
public String upload() {
return "upload";
}
//处理文件上传
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
try {
// 获取文件名
String fileName = file.getOriginalFilename();
// 获取文件的后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
// 文件上传路径
String filePath = "C:/temp/";
// 解决中文问题,liunx下中文路径,图片显示问题
fileName = UUID.randomUUID() + suffixName;
File dest = new File(filePath + fileName);
// 检测是否存在目录
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();// 新建文件夹
}
file.transferTo(dest);// 文件写入
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
}
return "上传失败!";
}
//下载文件
@GetMapping("/download/{fileName}")
public ResponseEntity<byte[]> download(@PathVariable("fileName") String fileName) throws IOException {
// 文件上传路径
String filePath = "C:/temp/";
File file = new File(filePath + fileName);
HttpHeaders headers = new HttpHeaders();
//下载显示的文件名,解决中文名称乱码问题
String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
//通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment", downloadFileName);
//application/octet-stream : 二进制流数据(最常见的文件下载)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
}
在上面的代码中,文件上传路径为 C:/temp/,你可以根据需要修改文件上传路径和下载路径。此外,为了避免文件名重复,上传文件会以随机 UUID 重新命名。
- 编译运行测试
在浏览器中访问 http://localhost:8080/upload ,上传文件即可。文件上传成功后,访问 http://localhost:8080/download/文件名 可以下载文件。
示例
下面给出两个文件上传下载的示例。
示例一:上传本地的文件
在上传文件页面中添加一个选择文件的 input ,代码如下:
<input type="file" name="file"/>
上传本地的文件后,可以在上传成功后的页面看到上传的文件名和下载链接。点击下载链接即可下载该文件。
示例二:上传 base64 编码的文件
在上传文件页面中添加一个 textarea,用来输入 base64 编码后的文件内容,代码如下:
<textarea name="file" rows="5" cols="50"></textarea>
文件上传时,需要对 base64 编码后的文件内容进行解码,代码如下:
// 将 base64 编码的字符串转换成 byte 数组
byte[] bytes = Base64Utils.decodeFromString(fileContent);
// 文件上传路径
String filePath = "C:/temp/";
// 将解码后的文件内容写入文件
FileUtils.writeByteArrayToFile(new File(filePath + fileName), bytes);
上传成功后,同样可以在页面上看到上传的文件名和下载链接。
结语
以上就是 Spring Boot + Thymeleaf 实现文件上传下载功能的完整攻略,希望可以帮助到你。如果你有任何问题或建议,请在评论区留言,我会及时回复你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot + thymeleaf 实现文件上传下载功能 - Python技术站