• @MultipartConfig注解


    前言:

            在学习Javaweb的Servlet文件上传和下载的过程中,我们会遇到一个特殊的注解---@MultipartConfig。

    @MultipartConfig的适用情况:

    1.文件上传: 当您的应用程序需要接收用户上传的文件时,可以在相应的 Servlet 上使用 @MultipartConfig 注解。通过使用该注解Servlet 可以方便地解析和处理 multipart/form-data 类型的请求,从中提取上传的文件。
    2.图片上传: 如果您的应用程序需要用户上传图片,例如头像、照片等,那么您可以使用 @Multipartconfig 注解来处理包含图片文件的表单请求。
    3.多媒体内容:如果您的应用程序需要处理包含音频、视频或其他多媒体内容的表单请求,您可以使用 @Multipartconfig 注解来处理这些请求并提取相应的多媒体文件。
    4.表单中的大量数据:有时,表单中可能包含大量的字段和数据。在这种情况下,@Multipartconfig 注解可以帮助您处理这些复杂的表单请求。

    以上也许您不想花大量的时间来阅读,那么我就用一句简单的话来解释:

    当您的应用程序需要处理包含文件或其他二进制数据的表单请求时,可以使用 @MultipartConfig 注解。它使得解析和处理 multipart/form-data 请求变得更加简单和方便。

    了解完@MultipartConfig注解的适用情况。接下来还是来看看API文档的描述吧。

    API文档内容:

    翻译过来就是:

    @MultipartConfig 注解可以应用于 Servlet 类上,用于指示该 Servlet 预期符合 multipart/form-data MIME 类型的请求。这通常用于处理包含文件上传的表单数据。

    当一个 Servlet 使用了 @MultipartConfig 注解后,它可以通过调用 getPart 或 getParts 方法来获取给定 multipart/form-data 请求的各个部分(Part 组件)。Part 组件代表了上传的文件或其他表单字段的数据。

    当然,这个注解还有一些属性,如下:

    这里不过多展开这些属性,只需要知道它有这几个属性:

    1.fileSizeThreshold(文件大小阈值):指定文件在超过该大小阈值后将被写入磁盘

    2.location(文件存储目录):指定文件将存储的目录位置。上传的文件将被存储在该指定的目录中

    3.maxFileSize(最大文件大小):指定允许上传的单个文件的最大大小

    4.maxRequestSize(最大请求大小):指定允许的 multipart/form-data 请求的最大大小。

    实例测试:

    那么还是先来看一下正常的代码与运行结果吧!

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport"
    6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    8. <link href = "Book_entry.css" rel="stylesheet" type = "text/css" />
    9. <title>图书录入系统title>
    10. head>
    11. <body>
    12. <h2>图书录入h2>
    13. <div>
    14. <form enctype="multipart/form-data" method="post" action="../Book_entry">
    15. <label for = "book_name">书籍名称: label><br>
    16. <input type = "text" id = "book_name" name = "book_name" placeholder="请输入书籍名称"><br><br>
    17. <label for = "publishing_house">出版社: label><br>
    18. <input type = "text" id = "publishing_house" name = "publishing_house" placeholder="请输入出版社"><br><br>
    19. <label for = "editor">编者: label><br>
    20. <input type = "text" id = "editor" name = "editor" placeholder="请输入编者"><br><br>
    21. <label for = "Price">价格: label><br>
    22. <input type = "text" id = "Price" name = "Price" placeholder="请输入价格"><br><br>
    23. <p>
    24. <input type="checkbox" value = "social_science" name = "Book_type" checked/>社会科学
    25. <input type="checkbox" value = "natural_science" name = "Book_type" />自然科学
    26. <input type="checkbox" value = "philosophy" name = "Book_type" />哲学
    27. <input type="checkbox" value = "novel" name = "Book_type" />小说
    28. <input type="checkbox" value = "art" name = "Book_type" />艺术
    29. p>
    30. <label>书籍介绍: label><br>
    31. <textarea name="description">textarea><br><br>
    32. <input type = "file" id = "photo" name = "photo" placeholder="请插入图片">
    33. <input type="submit" value="提交">
    34. form>
    35. div>
    36. body>
    37. html>
    1. package com.example;
    2. import com.example.Book;
    3. import jakarta.servlet.ServletException;
    4. import jakarta.servlet.annotation.MultipartConfig;
    5. import jakarta.servlet.annotation.WebServlet;
    6. import jakarta.servlet.http.HttpServlet;
    7. import jakarta.servlet.http.HttpServletRequest;
    8. import jakarta.servlet.http.HttpServletResponse;
    9. import jakarta.servlet.http.Part;
    10. import java.io.ByteArrayOutputStream;
    11. import java.io.FileOutputStream;
    12. import java.io.IOException;
    13. import java.io.InputStream;
    14. import java.util.ArrayList;
    15. import java.util.List;
    16. import java.util.UUID;
    17. @MultipartConfig
    18. @WebServlet("/Book_entry")
    19. public class BookServlet extends HttpServlet {
    20. private List books = new ArrayList<>();
    21. @Override
    22. protected void doPost(HttpServletRequest request, HttpServletResponse response)
    23. throws ServletException, IOException {
    24. request.setCharacterEncoding("utf-8");
    25. // 从请求参数中获取书籍信息
    26. String book_name = request.getParameter("book_name");
    27. String publishing_house = request.getParameter("publishing_house");
    28. String editor = request.getParameter("editor");
    29. String Price = request.getParameter("Price");
    30. String bookType = request.getParameter("Book_type");
    31. String description = request.getParameter("description");
    32. //获取上传的Part对象
    33. Part photo = request.getPart("photo");
    34. StringBuffer sb = new StringBuffer();
    35. if(book_name.isBlank())
    36. sb.append("必须输入书名");
    37. else if(publishing_house.isBlank())
    38. sb.append("必须输入出版社");
    39. else if(editor.isBlank())
    40. sb.append("必须输入作者");
    41. else if(Price.isBlank())
    42. sb.append("必须输入价格");
    43. else if(bookType.isBlank())
    44. sb.append("必须输入书的类型");
    45. else if(description.isBlank())
    46. sb.append("必须输入书籍介绍");
    47. else if(photo == null)
    48. sb.append("必须上传书的封面");
    49. // if(sb.length() != 0)
    50. // {
    51. // response.getWriter().println(sb);
    52. // return;
    53. // }
    54. // sb.append("书名:").append(book_name).append("
      ");
    55. // sb.append("出版社:").append(publishing_house).append("
      ");
    56. // sb.append("作者:").append(editor).append("
      ");
    57. // sb.append("价格:").append(Price).append("
      ");
    58. // sb.append("书类型:").append(bookType).append("
      ");
    59. // sb.append("书籍介绍:").append(description).append("
      ");
    60. //断言
    61. assert photo != null;
    62. InputStream is = photo.getInputStream();
    63. ByteArrayOutputStream baos = new ByteArrayOutputStream();
    64. byte[] b = new byte[1024];
    65. while(is.read(b)>0)
    66. {
    67. baos.write(b);
    68. }
    69. b = baos.toByteArray();
    70. UUID uuid = UUID.randomUUID();
    71. String sfn = photo.getSubmittedFileName();
    72. String suffix = sfn.substring(sfn.lastIndexOf("."));
    73. FileOutputStream fos = new FileOutputStream("D:/photo/" + uuid.toString() + suffix);
    74. fos.write(b);
    75. fos.close();
    76. String imageUrl = "D:/photo/" + uuid.toString() + suffix;
    77. // 创建Book对象
    78. Book book = new Book();
    79. book.setTitle(book_name);
    80. book.setPublisher(publishing_house);
    81. book.setEditor(editor);
    82. book.setPrice(Price);
    83. book.setDescription(description);
    84. // 将书籍信息添加到列表中
    85. books.add(book);
    86. // 返回成功信息
    87. response.setContentType("text/html;charset=utf-8");
    88. response.getWriter().println(sb);
    89. String head = """
    90. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    91. 图书信息
    92. """;
    93. head += "

      图书信息

      "
      ;
    94. head += "
      ";
    95. head += "

      书名:" + book_name + "

      "
      ;
    96. head += "

      出版社:" + publishing_house + "

      "
      ;
    97. head += "

      编辑:" + editor + "

      "
      ;
    98. head += "

      价格:" + Price + "

      "
      ;
    99. head += "

      书籍类型:" + bookType + "

      "
      ;
    100. head += "

      描述:" + description + "

      "
      ;
    101. head += " + uuid.toString() + suffix + "\" alt=\"书籍封面\">";
    102. head += "
      ";
  • response.getWriter().println(head);
  • }
  • }
  • 以上便是代码部分

    那么来看一下运行的结果!

    代码是正常运行的!

    但是!!!如果我们去掉@MultipartConfig的注解呢?

    我们发现:从html页面获取的内容为null

    调试结果也告诉我们:book_name为空了

    那么原因如下:

    如果你在处理包含文件上传的multipart/form-data类型的请求时没有添加@MultipartConfig注解,request.getParameter()方法无法直接获取文本框()中的内容,而会返回null

    这是因为在multipart/form-data类型的请求中,表单数据包含了文件和其他文本字段,而request.getParameter()方法只能用于获取application/x-www-form-urlencoded编码类型的表单参数值,不能直接获取multipart/form-data类型请求中的文本字段的值。

    当使用@MultipartConfig注解配置Servlet来处理multipart/form-data请求时,Servlet容器会根据该注解的配置,自动解析请求中的文件和文本字段,并将它们作为Part对象提供给开发者使用。

    要获取multipart/form-data请求中的文本字段的值,你可以使用request.getPart()方法来获取对应的Part对象,然后通过Part对象的getInputStream()方法读取文本字段的内容。

  • 相关阅读:
    springAOP面试题
    鲁大师特殊股息割韭菜
    idea如何隐藏background tasks
    由二项分布推导泊松分布中的两个使用公式的证明
    数据结构·找数
    java-php-python-婚纱影楼服务管理计算机毕业设计
    Qt 学习(四) —— QButtonGroup抽象容器
    集合幂级数相关
    大数据学习(5)-hive文件格式
    Life and Its Markovian Symphony
  • 原文地址:https://blog.csdn.net/zhuzhu_YT/article/details/133749809