赞
踩
public interface MultipartFile extends InputStreamSource { String getName();//返回参数的名称 @Nullable String getOriginalFilename();//获取上传文件的名称 @Nullable String getContentType();//返回文件的内容类型 boolean isEmpty();//判断是否为空,或者上传的文件是否有内容 long getSize();//返回文件大小 以字节为单位 byte[] getBytes() throws IOException;//将文件内容转化成一个byte[] 返回 InputStream getInputStream() throws IOException;//返回InputStream读取文件的内容 default Resource getResource() { return new MultipartFileResource(this); } //保存上传文件到目标Dest中 void transferTo(File dest) throws IOException, IllegalStateException; default void transferTo(Path dest) throws IOException, IllegalStateException { FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest)); } }
<!-- 文件名:uploadfile.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <h3>上传文件</h3> <div> </div> <form action="uploadFile" enctype="multipart/form-data" method="post"> 选择需要上传的文件:<input type="file" value="选择文件" name="uploadFile"> <br> <input type="submit" value="上传文件"> </form> </body> </html>
<!-- 文件名:upload_success.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传成功</title>
</head>
<body>
<h3>文件上传成功</h3>
</body>
</html>
@Controller public class UploadFileController { @PostMapping("/uploadFile") public String uploadFile(@RequestParam("uploadFile") MultipartFile multipartFile) throws IOException { //首先判断上传的文件是否为空 if (!multipartFile.isEmpty()) { String suffix = ".unknown";//初始文件后缀为不知道 String name = multipartFile.getOriginalFilename();//获取上传的文件名 System.out.println(name); //获取文件的后缀 if (name != null && name.indexOf(".") > 0) { suffix = name.substring(name.indexOf(".")); } String dest = UUID.randomUUID() + suffix;//生成保存的文件名 multipartFile.transferTo(new File("G:/files/" + dest));//保存文件到指定位置 } //防止刷新,重复上传 return "redirect:/upload_success.html"; } }
<!-- 文件名:5xx.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>出现了 5XX 错误!!!</h3>
</body>
</html>
<!-- 文件名:4xx.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>出现了 4XX 错误!!!</h3>
</body>
</html>

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <h3>上传文件</h3> <div> </div> <form action="uploadFile" enctype="multipart/form-data" method="post"> 选择需要上传的文件 1:<input type="file" value="选择文件" name="uploadFile"> <br> 选择需要上传的文件 2:<input type="file" value="选择文件" name="uploadFile"> <br> 选择需要上传的文件 3:<input type="file" value="选择文件" name="uploadFile"> <br> <input type="submit" value="上传文件"> </form> </body> </html>
Servlet3.0 规范中,定义了 Jakarta.servlet.http.Part 接口处理 mulitipart/form-data POST 请求中接收到的表单数据。有了 Part 对象,其 write() 方法将上传文件保存到服务器本地的磁盘中。
在 HttpServletRequest 接口中引入的新方法:
Spring Boot3 使用的 Servlet 规范是基于 5 的,所以上传文件使用的就是 Part 接口。
StandardServletMultipartResolver 对 Part 接口进行的封装,实现基于 Servlet 规范的文件上传。
public interface Part {
InputStream getInputStream() throws IOException;//获取输入流用于检索文件的内容
String getContentType();//获取文件内容类型
String getName();//获取file控件的name属性
String getSubmittedFileName();//获取上传文件名Servlet3.1 Tomcat8.0实现
long getSize();//获取上传文件的大小
void write(String fileName) throws IOException; //将文件内容写入指定的磁盘位置
void delete() throws IOException;//删除Part数据和临时目录数据,默认会删除
String getHeader(String name);//获取指定请求头
Collection<String> getHeaders(String name);//获取指定header名称的集合数据
Collection<String> getHeaderNames();//获取所有请求头的名称
}
@PostMapping("/files") public String upload(HttpServletRequest request){ try { for (Part part : request.getParts()) { String fileName = extractFileName(part); part.write(fileName); } } catch (IOException | ServletException e) { throw new RuntimeException(e); } return "redirect:/upload_success.html"; } private String extractFileName(Part part) { String contentDis = part.getHeader("content-disposition"); String[] items = contentDis.split(";"); for (String s : items) { if (s.trim().startsWith("filename")) { return s.substring(s.indexOf("=") + 2, s.length()-1); } } return ""; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。