概述
文件上传是Web应用开发中常见的需求之一,Spring Boot提供了便捷的方式来实现文件上传功能。本篇技术长博文将详细介绍如何在Spring Boot应用中实现文件上传,包括前端页面、Controller处理、文件存储以及安全性考虑,通过代码示例演示了实际操作。
文件上传原理
表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
当表单的enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value
当表单的enctype="multipart/form-data"时,其传输数据形式如下
1. 创建Spring Boot项目
首先,在IDE中创建一个新的Spring Boot项目,确保已包含Web依赖。
2. 编写前端页面
在src/main/resources/templates
目录下创建一个HTML页面,用于文件上传。
<!DOCTYPE html>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<h1>文件上传示例</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept=".jpg, .png, .pdf">
<button type="submit">上传文件</button>
</form>
</body>
</html>
3. 编写Controller处理文件上传
创建一个Controller类,处理文件上传请求并保存文件。
@Controller
public class FileUploadController {
private static final String UPLOAD_DIR = "uploads/";
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "redirect:/uploadFailure";
}
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename());
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
return "redirect:/uploadFailure";
}
return "redirect:/uploadSuccess";
}
}
4. 文件存储与访问
在src/main/resources
目录下创建一个uploads
文件夹,用于存储上传的文件。为了访问这些文件,你可以配置Spring Boot的静态资源路径。
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:uploads/
5. 添加路由与页面展示
创建两个简单的HTML页面,用于展示上传结果。
uploadSuccess.html
:
<!DOCTYPE html>
<html>
<head>
<title>上传成功</title>
</head>
<body>
<h1>上传成功</h1>
<a href="/upload">返回</a>
</body>
</html>
uploadFailure.html
:
<!DOCTYPE html>
<html>
<head>
<title>上传失败</title>
</head>
<body>
<h1>上传失败</h1>
<a href="/upload">返回</a>
</body>
</html>
6. 运行与测试
运行Spring Boot应用,访问http://localhost:8081/upload
,上传一个文件,然后会根据上传结果跳转到相应的页面。
7.其他
Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
要更改这个默认值需要在配置文件(如application.properties)中加入两个配置
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
上传功能
当表单的enctype="multipart/form-data"时,可以使用MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中
package com.example.controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {
System.out.println(nickname);
// 获取图片的原始名称
System.out.println(photo.getOriginalFilename());
// 取文件类型
System.out.println(photo.getContentType());
String path = request.getServletContext().getRealPath("/upload/");
System.out.println(path);
saveFile(photo,path);
return "上传成功";
}
//
public void saveFile(MultipartFile photo,String path) throws IOException {
// 判断存储的目录是否存在,如果不存在则创建
File dir = new File(path);
if(!dir.exists()){
// 创建目录
dir.mkdir();
}
File file = new File(path+photo.getOriginalFilename());
photo.transferTo(file);
}
}
测试
总结
本文详细介绍了如何在Spring Boot应用中实现文件上传功能。通过前端页面、Controller处理、文件存储和页面展示等步骤,你可以轻松地在Spring Boot应用中添加文件上传功能。通过学习本文内容,你可以更加深入地理解文件上传的实现原理,从而在实际项目中应用和扩展该功能。