1、创建基本的项目框架
    在创建项目后先需要确认项目架构是否有 multipartResolver 文件上传解析组件。
    springBoot默认会把multipartResolver组件一起加载, 在启动器来获取所有的组件名称

    1. package com.xiaohui;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.context.ConfigurableApplicationContext;
    5. @SpringBootApplication
    6. public class SpringBoot07FileuploadApplication {
    7. public static void main(String[] args) {
    8. ConfigurableApplicationContext context = SpringApplication.run(SpringBoot07FileuploadApplication.class, args);
    9. String[] names = context.getBeanDefinitionNames();
    10. for (String name : names) {
    11. System.out.println(name);
    12. }
    13. }
    14. }

    image.png
    如果没看见multipartResolver 组件名称也可以通过导入文件上传依赖的jar进行使用

    1. <!--文件上传依赖-->
    2. <dependency>
    3. <groupId>commons-fileupload</groupId>
    4. <artifactId>commons-fileupload</artifactId>
    5. <version>1.4</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>commons-io</groupId>
    9. <artifactId>commons-io</artifactId>
    10. <version>2.8.0</version>
    11. </dependency>

    导入依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.projectlombok</groupId>
    7. <artifactId>lombok</artifactId>
    8. <optional>true</optional>
    9. </dependency>
    10. <dependency>
    11. <groupId>org.springframework.boot</groupId>
    12. <artifactId>spring-boot-starter-test</artifactId>
    13. <scope>test</scope>
    14. </dependency>

    在静态资源存放路径下创建一个html文件

    1. <html>
    2. <head>
    3. <meta charset="UTF-8">
    4. <title>Title</title>
    5. <style>
    6. .progress {
    7. width: 200px;
    8. height: 10px;
    9. border: 1px solid #ccc;
    10. border-radius: 10px;
    11. margin: 10px 0px;
    12. overflow: hidden;
    13. }
    14. /* 初始状态设置进度条宽度为0px */
    15. .progress > div {
    16. width: 0px;
    17. height: 100%;
    18. background-color: yellowgreen;
    19. transition: all .3s ease;
    20. }
    21. </style>
    22. <script type="text/javascript" src="js/jquery.min.js"></script>
    23. <script type="text/javascript">
    24. $(function(){
    25. $("#uploadFile").click(function(){
    26. // 获取要上传的文件
    27. var photoFile =$("#photo")[0].files[0]
    28. if(photoFile==undefined){
    29. alert("您还未选中文件")
    30. return;
    31. }
    32. // 将文件装入FormData对象
    33. var formData =new FormData();
    34. formData.append("headPhoto",photoFile)
    35. // ajax向后台发送文件
    36. $.ajax({
    37. type:"post",
    38. data:formData,
    39. url:"file/upload",
    40. processData:false,
    41. contentType:false,
    42. success:function(result){
    43. // 接收后台响应的信息
    44. alert(result.message)
    45. // 图片回显
    46. $("#headImg").attr("src",result.newFileName);
    47. },
    48. xhr: function() {
    49. var xhr = new XMLHttpRequest();
    50. //使用XMLHttpRequest.upload监听上传过程,注册progress事件,打印回调函数中的event事件
    51. xhr.upload.addEventListener('progress', function (e) {
    52. //loaded代表上传了多少
    53. //total代表总数为多少
    54. var progressRate = (e.loaded / e.total) * 100 + '%';
    55. //通过设置进度条的宽度达到效果
    56. $('.progress > div').css('width', progressRate);
    57. })
    58. return xhr;
    59. }
    60. })
    61. })
    62. })
    63. </script>
    64. </head>
    65. <body>
    66. <form action="file/upload" method="post" enctype="multipart/form-data">
    67. <p>账号<input type="text" name="name"></p>
    68. <p>密码<input type="text" name="password"></p>
    69. <p>昵称<input type="text" name="nickname"></p>
    70. <p>头像:
    71. <br/>
    72. <input id="photo" name="photo" type="file">
    73. <input id="photos" name="photos" type="file" multiple>
    74. <br/>
    75. <img id="headImg" style="width: 200px;height: 200px" alt="你还未上传图片">
    76. <br/>
    77. <div class="progress">
    78. <div></div>
    79. </div>
    80. <a id="uploadFile" href="javascript:void(0)">立即上传</a>
    81. </p>
    82. <p><input type="submit" value="注册"></p>
    83. </form>
    84. </body>
    85. </html>
    1. package com.xiaohui.controller;
    2. import com.sun.jersey.api.client.Client;
    3. import com.sun.jersey.api.client.WebResource;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.ResponseBody;
    7. import org.springframework.web.multipart.MultipartFile;
    8. import javax.servlet.http.HttpServletRequest;
    9. import java.io.File;
    10. import java.util.HashMap;
    11. import java.util.Map;
    12. import java.util.UUID;
    13. /**
    14. * @author hh
    15. * @date 2022/2/27 15:45
    16. * Version 1.0
    17. */
    18. @Controller
    19. @RequestMapping("/file")
    20. public class FileUploadController {
    21. // 文件存储位置
    22. private final static String FILESERVER="http://127.0.0.1:8090/upload/";
    23. @RequestMapping("upload")
    24. @ResponseBody
    25. public Map<String,String> fileUpload(MultipartFile headPhoto, HttpServletRequest req) throws Exception {
    26. Map<String,String> map=new HashMap<>();
    27. // 指定文件存储目录为我们项目部署环境下的upload目录
    28. String realPath = req.getServletContext().getRealPath("/upload");
    29. File dir = new File(realPath);
    30. // 如果不存在则创建目录
    31. if(!dir.exists()){
    32. dir.mkdirs();
    33. }
    34. // 获取文件名
    35. String originalFilename = headPhoto.getOriginalFilename();
    36. // 避免文件名冲突,使用UUID替换文件名
    37. String uuid = UUID.randomUUID().toString();
    38. // 获取拓展名
    39. String extendsName = originalFilename.substring(originalFilename.lastIndexOf("."));
    40. // 新的文件名
    41. String newFileName=uuid.concat(extendsName);
    42. // 创建 sun公司提供的jersey包中的client对象
    43. Client client= Client.create();
    44. WebResource resource = client.resource(FILESERVER + newFileName);
    45. // 文件保存到另一个服务器上去了
    46. resource.put(String.class, headPhoto.getBytes());
    47. // 上传成功之后,把文件的名字和文件的类型返回给浏览器
    48. map.put("message", "上传成功");
    49. map.put("newFileName", FILESERVER+newFileName);
    50. map.put("filetype", headPhoto.getContentType());
    51. return map;
    52. }
    53. }

    yml中配置文件大小限制

    1. spring:
    2. servlet:
    3. multipart:
    4. max-file-size: 10MB #单个文件上传最大为10MB
    5. max-request-size: 100MB #多个文件上传总和不超过100MB

    多文件同步上传处理方式

    1. <form action="file/upload" method="post" enctype="multipart/form-data">
    2. <p>账号<input type="text" name="name"></p>
    3. <p>密码<input type="text" name="password"></p>
    4. <p>昵称<input type="text" name="nickname"></p>
    5. <p>头像:
    6. <br/>
    7. <input id="photo" name="photo" type="file">
    8. <input id="photos" name="photos" type="file" multiple>
    9. <br/>
    10. <img id="headImg" style="width: 200px;height: 200px" alt="你还未上传图片">
    11. <br/>
    12. <div class="progress">
    13. <div></div>
    14. </div>
    15. <a id="uploadFile" href="javascript:void(0)">立即上传</a>
    16. </p>
    17. <p><input type="submit" value="注册"></p>
    18. </form>

    后台接收的处理单元参数处理

    1. public Map<String,String> upload(String name,
    2. String password,
    3. String nickname,
    4. @RequestPart("photo") MultipartFile photo,
    5. @RequestPart("photos") MultipartFile[] photos, HttpServletRequest req)