网站建设运营知识,建设工程合同管理考试试题及答案,全国做临期进口食品的网站,国内网站设计欣赏前言#xff1a; 在学习Javaweb的Servlet文件上传和下载的过程中#xff0c;我们会遇到一个特殊的注解---MultipartConfig。 MultipartConfig的适用情况#xff1a;
1.文件上传: 当您的应用程序需要接收用户上传的文件时#xff0c;可以在相应的 Servlet 上使用 Multipart…前言 在学习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 请求的最大大小。 实例测试
那么还是先来看一下正常的代码与运行结果吧
!doctype html
html langenheadmeta charsetUTF-8meta nameviewportcontentwidthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0meta http-equivX-UA-Compatible contentieedgelink href Book_entry.css relstylesheet type text/css /title图书录入系统/title
/head
body
!--书籍名称、出版社、编者、价格、书籍介绍--h2图书录入/h2
divform enctypemultipart/form-data methodpost action../Book_entrylabel for book_name书籍名称: /labelbrinput type text id book_name name book_name placeholder请输入书籍名称brbrlabel for publishing_house出版社: /labelbrinput type text id publishing_house name publishing_house placeholder请输入出版社brbrlabel for editor编者: /labelbrinput type text id editor name editor placeholder请输入编者brbrlabel for Price价格: /labelbrinput type text id Price name Price placeholder请输入价格brbrpinput typecheckbox value social_science name Book_type checked/社会科学input typecheckbox value natural_science name Book_type /自然科学input typecheckbox value philosophy name Book_type /哲学input typecheckbox value novel name Book_type /小说input typecheckbox value art name Book_type /艺术/plabel书籍介绍: /labelbrtextarea namedescription/textareabrbrinput type file id photo name photo placeholder请插入图片input typesubmit value提交/form
/div/body
/html
package com.example;import com.example.Book;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;MultipartConfig
WebServlet(/Book_entry)public class BookServlet extends HttpServlet {private ListBook books new ArrayList();Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding(utf-8);// 从请求参数中获取书籍信息String book_name request.getParameter(book_name);String publishing_house request.getParameter(publishing_house);String editor request.getParameter(editor);String Price request.getParameter(Price);String bookType request.getParameter(Book_type);String description request.getParameter(description);//获取上传的Part对象Part photo request.getPart(photo);StringBuffer sb new StringBuffer();if(book_name.isBlank())sb.append(必须输入书名);else if(publishing_house.isBlank())sb.append(必须输入出版社);else if(editor.isBlank())sb.append(必须输入作者);else if(Price.isBlank())sb.append(必须输入价格);else if(bookType.isBlank())sb.append(必须输入书的类型);else if(description.isBlank())sb.append(必须输入书籍介绍);else if(photo null)sb.append(必须上传书的封面);// if(sb.length() ! 0)
// {
// response.getWriter().println(sb);
// return;
// }
// sb.append(书名).append(book_name).append(br);
// sb.append(出版社).append(publishing_house).append(br);
// sb.append(作者).append(editor).append(br);
// sb.append(价格).append(Price).append(br);
// sb.append(书类型).append(bookType).append(br);
// sb.append(书籍介绍).append(description).append(br);//断言assert photo ! null;InputStream is photo.getInputStream();ByteArrayOutputStream baos new ByteArrayOutputStream();byte[] b new byte[1024];while(is.read(b)0){baos.write(b);}b baos.toByteArray();UUID uuid UUID.randomUUID();String sfn photo.getSubmittedFileName();String suffix sfn.substring(sfn.lastIndexOf(.));FileOutputStream fos new FileOutputStream(D:/photo/ uuid.toString() suffix);fos.write(b);fos.close();String imageUrl D:/photo/ uuid.toString() suffix;// 创建Book对象Book book new Book();book.setTitle(book_name);book.setPublisher(publishing_house);book.setEditor(editor);book.setPrice(Price);book.setDescription(description);// 将书籍信息添加到列表中books.add(book);// 返回成功信息response.setContentType(text/html;charsetutf-8);response.getWriter().println(sb);String head !doctype htmlhtml langenheadmeta charsetUTF-8meta nameviewportcontentwidthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0meta http-equivX-UA-Compatible contentieedgetitle图书信息/titlelink href ./Book_entry.css relstylesheet type text/css//headbody;head h3 style\text-align:center\图书信息/h3;head div;head p书名 book_name /p;head p出版社 publishing_house /p;head p编辑 editor /p;head p价格 Price /p;head p书籍类型 bookType /p;head p描述 description /p;head img src\D:/photo/ uuid.toString() suffix \ alt\书籍封面\;head /div;response.getWriter().println(head);}
}
以上便是代码部分
那么来看一下运行的结果 代码是正常运行的 但是如果我们去掉MultipartConfig的注解呢 我们发现从html页面获取的内容为null 调试结果也告诉我们book_name为空了 那么原因如下
如果你在处理包含文件上传的multipart/form-data类型的请求时没有添加MultipartConfig注解request.getParameter()方法无法直接获取文本框input typetext中的内容而会返回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()方法读取文本字段的内容。