当前位置:   article > 正文

Spring boot文件上传_springboot文件上传

springboot文件上传

目录

1.准备工作

1.创建Springboot项目添加web依赖

2.创建upload.html页面

2.单文件上传

创建文件上传接口

​编辑 单文件上传优化

3.多文件上传

4.整合为工具类


1.准备工作

1.创建Springboot项目添加web依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

2.创建upload.html页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h2>上传单个文件到服务器路径下</h2>
  9. <form action="/uploadServerFile" method="post" enctype="multipart/form-data">
  10. <input type="file" name="uploadFile" value="请选择文件">
  11. <input type="submit" value="上传">
  12. </form>
  13. <h2>上传单个文件</h2>
  14. <form action="/uploadPahtFile" method="post" enctype="multipart/form-data">
  15. <input type="file" name="uploadFile" value="请选择文件">
  16. <input type="submit" value="上传">
  17. </form>
  18. <h2>上传多个文件</h2>
  19. <form action="/uploadPahtFiles" method="post" enctype="multipart/form-data">
  20. <input type="file" name="uploadFiles" value="请选择文件" multiple="multiple">
  21. <input type="submit" value="上传">
  22. </form>
  23. </body>
  24. </html>

enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值) 

描述
application/x-www-form-urlencoded在发送前编码所有字符(默认)
multipart/form-data不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain空格转换为 “+” 加号,但不对特殊字符编码。

2.单文件上传

创建文件上传接口

  1. import org.springframework.web.multipart.MultipartFile;
  2. import javax.servlet.http.HttpServletRequest;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.UUID;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.bind.annotation.RestController;
  12. @RestController
  13. public class FileUploadController {
  14. //以时间作为文件夹
  15. static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
  16. @PostMapping("/uploadServerFile")
  17. public String uploadServerFile(MultipartFile uploadFile, HttpServletRequest req) {
  18. if ("".equals(uploadFile.getOriginalFilename())){
  19. return "";
  20. }
  21. //文件存在的物理路径,但会随着项目的重新启动而改变
  22. String realPath =
  23. req.getSession().getServletContext().getRealPath("/uploadFile/");
  24. System.out.println(realPath);
  25. String format = sdf.format(new Date());
  26. File folder = new File(realPath + format);
  27. String filePath="";
  28. if (!folder.isDirectory()) {
  29. folder.mkdirs();
  30. }
  31. //当前文件名
  32. String oldName = uploadFile.getOriginalFilename();
  33. //新文件名
  34. String newName = UUID.randomUUID().toString() +
  35. oldName.substring(oldName.lastIndexOf("."), oldName.length());
  36. try {
  37. //将接收到的文件传输到给定的目标文件。
  38. uploadFile.transferTo(new File(folder, newName));
  39. //项目访问文件的路径
  40. filePath = req.getScheme() + "://" + req.getServerName() + ":" +
  41. req.getServerPort() + "/uploadFile/" + format + newName;
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. return "上传失败! ";
  45. }
  46. return filePath;
  47. }
  48. }

其对应html的第一个表单,然后上传文件测试。

选择文件后点击上传按钮,显示如下,返回的路径可以通过通过浏览器访问。

 单文件上传优化

但是这样做是有问题,上传图片到服务器根路径下的文件夹里,若重启服务器,图片则无法访问,这是因为每次重启服务器之后,都会在系统临时文件夹内,创建一个新的服务器,图片就保存在这里,若重启,又会产生一个新的服务器,此时访问的就是新服务器的图片资源,而图片根本就不在新服务器内。

  • windows的临时文件夹位置:

C:\Users\User\AppData\Local\Temp

开始修改

设置的图片保存路径的末尾必须有 /,代码中默认保存路径最后已经带有/

  1. import org.springframework.web.multipart.MultipartFile;
  2. import javax.servlet.http.HttpServletRequest;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.UUID;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.bind.annotation.RestController;
  12. @RestController
  13. public class FileUploadController {
  14. //以时间作为文件夹
  15. static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
  16. //文件存放的路径
  17. public static String fileSavePath="E:/uploadFile/";
  18. @PostMapping("/uploadPahtFile")
  19. public String uploadPahtFile(MultipartFile uploadFile, HttpServletRequest req) {
  20. if ("".equals(uploadFile.getOriginalFilename())){
  21. return "";
  22. }
  23. String filePath = "";
  24. String format = sdf.format(new Date());
  25. //固定物理路径
  26. File folder = new File(fileSavePath + format);
  27. //如果文件夹不存在则创建
  28. if (!folder.isDirectory()) {
  29. folder.mkdirs();//创建文件夹
  30. }
  31. //上传的文件名
  32. String oldName = uploadFile.getOriginalFilename();
  33. //新的文件名
  34. String newName = UUID.randomUUID().toString() +
  35. oldName.substring(oldName.lastIndexOf("."), oldName.length());
  36. try {
  37. //将uploadFile存到一个路径为:folder,名字为:newName的文件,
  38. uploadFile.transferTo(new File(folder, newName));
  39. //获取项目访问的路径
  40. filePath = req.getScheme() + "://" + req.getServerName() + ":" +
  41. req.getServerPort() + "/uploadFile/" + format + newName;
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. return "上传失败! ";
  45. }
  46. return filePath;
  47. }
  48. }

其对应html的第二个form,选择这种方式时需要对静态资源进行映射

 添加配置类,配置资源映射

  1. import com.li.utils.FileUploadUtil;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. @Configuration
  6. public class WebConfig implements WebMvcConfigurer {
  7. /**
  8. * 图片保存路径,自动从yml文件中获取数据
  9. * 示例: E:/uploadFile/
  10. */
  11. private String fileSavePath= "E:/uploadFile/";
  12. @Override
  13. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  14. /**
  15. * 配置资源映射
  16. * 意思是:如果访问的资源路径是以“/uploadFile/”开头的,
  17. * 就给我映射到本机的“E:/uploadFile/”这个文件夹内,去找你要的资源
  18. * 注意:E:/uploadFile/ 后面的 “/”一定要带上
  19. */
  20. registry.addResourceHandler("/uploadFile/**")
  21. .addResourceLocations("file:"+fileSavePath);
  22. }
  23. }

之后同上进行测试。

这时上传后再重启项目,依然可以访问之前上传的文件。

静态资源位置除了classpath下面的4个路径之外,还有一个"/",因此这里的图片虽然是静态资源却可以直接访问到。

一文件上传的配置参数:

  1. #是否开启文件上传支持,默认为true。
  2. spring. servlet.multipart.enabled=true
  3. #文件写入磁盘的阈值,默认为0。
  4. spring.servlet.multipart.file-size-threshold=0
  5. #上传文件的临时保存位置。
  6. spring.servlet.multipart.location=E:ltemp
  7. #上传的单个文件的最大大小,默认为1MB。
  8. spring.servlet.multipart.max-file-size=1MB
  9. #多文件上传时文件的总大小,默认为10MB。
  10. spring.servlet.multipart.max-request-size=10MB
  11. #文件是否延迟解析,默认为false。
  12. spring.servlet.multipart.resolve-lazily=false

3.多文件上传

再上一个为基础进行修改,将原本接收的的MultipartFile对象变成数组

  1. import org.springframework.web.multipart.MultipartFile;
  2. import javax.servlet.http.HttpServletRequest;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.UUID;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.bind.annotation.RestController;
  12. @RestController
  13. public class FileUploadController {
  14. //以时间作为文件夹
  15. static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
  16. //文件存放的路径
  17. public static String fileSavePath="E:/uploadFile/";
  18. @PostMapping("/uploadPahtFiles")
  19. public static List<String> uploadPahtFiles(MultipartFile[] uploadFiles, HttpServletRequest req) {
  20. //所传入文件项目访问路径的集合
  21. ArrayList<String> filePathlist=new ArrayList();
  22. String filePath = "";
  23. for(MultipartFile uploadFile:uploadFiles){
  24. //如果文件名位空,则不保存
  25. if ("".equals(uploadFile.getOriginalFilename())){
  26. continue;
  27. }
  28. String format = sdf.format(new Date());
  29. File folder = new File(fileSavePath + format);
  30. if (!folder.isDirectory()) {
  31. folder.mkdirs();
  32. }
  33. String oldName = uploadFile.getOriginalFilename();
  34. String newName = UUID.randomUUID().toString() +
  35. oldName.substring(oldName.lastIndexOf("."), oldName.length());
  36. try {
  37. uploadFile.transferTo(new File(folder, newName));
  38. filePath = req.getScheme() + "://" + req.getServerName() + ":" +
  39. req.getServerPort() + "/uploadFile/" + format + newName;
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. //将访问路径放入集合中
  44. filePathlist.add(filePath);
  45. }
  46. return filePathlist;
  47. }
  48. }

:multiple="multiple" 是倍数(多选)的意思,再input标签中加上他就可以按Ctrl进行多选了。

<input type="file" name="file" multiple="multiple"/>

4.整合为工具类

对其整合成工具类以便使用

  1. import org.springframework.web.multipart.MultipartFile;
  2. import javax.servlet.http.HttpServletRequest;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.UUID;
  10. /**
  11. * 文件上传工具类
  12. */
  13. public class FileUploadUtil {
  14. //以时间作为文件夹
  15. static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
  16. //文件存放的路径
  17. public static String fileSavePath="E:/uploadFile/";
  18. /**
  19. * 上传文件到指定路径中,
  20. * 例如 fileSavePath=E:/uploadFile/"
  21. * @param uploadFile uploadPahtFile
  22. * @param req request
  23. * @return 返回通过项目访问文件的路径(需要配置资源映射)
  24. */
  25. public static String uploadPahtFile(MultipartFile uploadFile, HttpServletRequest req) {
  26. if ("".equals(uploadFile.getOriginalFilename())){
  27. return "";
  28. }
  29. String filePath = "";
  30. String format = sdf.format(new Date());
  31. //固定物理路径
  32. File folder = new File(fileSavePath + format);
  33. //如果文件夹不存在则创建
  34. if (!folder.isDirectory()) {
  35. folder.mkdirs();//创建文件夹
  36. }
  37. //上传的文件名
  38. String oldName = uploadFile.getOriginalFilename();
  39. //新的文件名
  40. String newName = UUID.randomUUID().toString() +
  41. oldName.substring(oldName.lastIndexOf("."), oldName.length());
  42. try {
  43. //将uploadFile存到一个路径为:folder,名字为:newName的文件,
  44. uploadFile.transferTo(new File(folder, newName));
  45. //获取项目访问的路径
  46. filePath = req.getScheme() + "://" + req.getServerName() + ":" +
  47. req.getServerPort() + "/uploadFile/" + format + newName;
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. return "上传失败! ";
  51. }
  52. return filePath;
  53. }
  54. /**
  55. * 上传文件到服务器路径,
  56. * 当上传过后项目再一次启动则会改变之前的路径,
  57. * 之前的文件也无法访问到了,但是还存在再电脑的临时文件夹 Temp 中
  58. * @param uploadFile 上传的文件
  59. * @param req request
  60. * @return 返回通过项目访问文件的路径(不需要配置资源映射)
  61. */
  62. public static String uploadServerFile(MultipartFile uploadFile, HttpServletRequest req) {
  63. if ("".equals(uploadFile.getOriginalFilename())){
  64. return "";
  65. }
  66. //文件存在的物理路径,但会随着项目的重新启动而改变
  67. String realPath =
  68. req.getSession().getServletContext().getRealPath("/uploadFile/");
  69. System.out.println(realPath);
  70. String format = sdf.format(new Date());
  71. File folder = new File(realPath + format);
  72. String filePath="";
  73. if (!folder.isDirectory()) {
  74. folder.mkdirs();
  75. }
  76. //当前文件名
  77. String oldName = uploadFile.getOriginalFilename();
  78. //新文件名
  79. String newName = UUID.randomUUID().toString() +
  80. oldName.substring(oldName.lastIndexOf("."), oldName.length());
  81. try {
  82. //将接收到的文件传输到给定的目标文件。
  83. uploadFile.transferTo(new File(folder, newName));
  84. //项目访问文件的路径
  85. filePath = req.getScheme() + "://" + req.getServerName() + ":" +
  86. req.getServerPort() + "/uploadFile/" + format + newName;
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. return "上传失败! ";
  90. }
  91. return filePath;
  92. }
  93. /**
  94. * 上传多个文件到指定路径中
  95. * @param uploadFiles uploadPahtFile
  96. * @param req request
  97. * @return 返回通过项目访问文件的路径的集合(需要配置资源映射)
  98. */
  99. public static List<String> uploadPahtFiles(MultipartFile[] uploadFiles, HttpServletRequest req) {
  100. //所传入文件项目访问路径的集合
  101. ArrayList<String> filePathlist=new ArrayList();
  102. String filePath = "";
  103. for(MultipartFile uploadFile:uploadFiles){
  104. //如果文件名位空,则不保存
  105. if ("".equals(uploadFile.getOriginalFilename())){
  106. continue;
  107. }
  108. String format = sdf.format(new Date());
  109. File folder = new File(fileSavePath + format);
  110. if (!folder.isDirectory()) {
  111. folder.mkdirs();
  112. }
  113. String oldName = uploadFile.getOriginalFilename();
  114. String newName = UUID.randomUUID().toString() +
  115. oldName.substring(oldName.lastIndexOf("."), oldName.length());
  116. try {
  117. uploadFile.transferTo(new File(folder, newName));
  118. filePath = req.getScheme() + "://" + req.getServerName() + ":" +
  119. req.getServerPort() + "/uploadFile/" + format + newName;
  120. } catch (IOException e) {
  121. e.printStackTrace();
  122. }
  123. //将访问路径放入集合中
  124. filePathlist.add(filePath);
  125. }
  126. return filePathlist;
  127. }
  128. }
  129. //配置资源映射的配置类
  130. //@Configuration
  131. //public class WebConfig implements WebMvcConfigurer {
  132. // /**
  133. // * 图片保存路径,自动从yml文件中获取数据
  134. // * 示例: E:/uploadFile/
  135. // */
  136. // private String fileSavePath= FileUploadUtil.fileSavePath;
  137. //
  138. // @Override
  139. // public void addResourceHandlers(ResourceHandlerRegistry registry) {
  140. // /**
  141. // * 配置资源映射
  142. // * 意思是:如果访问的资源路径是以“/uploadFile/”开头的,
  143. // * 就给我映射到本机的“E:/uploadFile/”这个文件夹内,去找你要的资源
  144. // * 注意:E:/uploadFile/ 后面的 “/”一定要带上
  145. // */
  146. // registry.addResourceHandler("/uploadFile/**")
  147. // .addResourceLocations("file:"+fileSavePath);
  148. // }
  149. //}
  150. //文件上传的配置参数
  151. //#是否开启文件上传支持,默认为true。
  152. //spring. servlet.multipart.enabled=true
  153. //#文件写入磁盘的阈值,默认为0。
  154. //spring.servlet.multipart.file-size-threshold=0
  155. //#上传文件的临时保存位置。
  156. //spring.servlet.multipart.location=E:ltemp
  157. //#上传的单个文件的最大大小,默认为1MB。
  158. //spring.servlet.multipart.max-file-size=1MB
  159. //#多文件上传时文件的总大小,默认为10MB。
  160. //spring.servlet.multipart.max-request-size=10MB
  161. //#文件是否延迟解析,默认为false。
  162. //spring.servlet.multipart.resolve-lazily=false

以上就是Spring boot对文件的上传了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/902178
推荐阅读
相关标签
  

闽ICP备14008679号