Servlet 3.0+ 应使用 @MultipartConfig 注解配合 request.getPart() 获取 XML 文件,通过 InputStream 读取字节并以 UTF-8 解码为字符串,不可用 getParameter();老版本才需 Apache Commons FileUpload。

Servlet接收multipart/form-data中的XML文件,不能用request.getParameter()
XML文件作为二进制附件上传时,它不在表单参数里,而是在 multipart body 的一个 part 中。直接调用 request.getParameter("xmlFile") 一定返回 null —— 这是新手最常踩的坑。
Java Servlet 原生不解析 multipart,必须借助第三方库(如 Apache Commons FileUpload)或使用 Servlet 3.0+ 内置 API。
- Servlet 3.0+ 推荐用
@MultipartConfig+request.getPart(),无需额外依赖 - 若项目受限于老版本(如 Servlet 2.5),才需引入
commons-fileupload和commons-io - 注意:Spring MVC 的
@RequestParam MultipartFile是另一套封装,这里只谈原生 Servlet
用@MultipartConfig和getPart()读取XML内容
这是目前最轻量、最可控的方式。关键点在于:Part 对象不是字符串,而是带 headers 的输入流,需手动提取原始字节并转为字符串(注意编码)。
-
Part.getSubmittedFileName()获取上传的原始文件名(含扩展名) -
Part.getContentType()可校验是否为text/xml或application/xml,但不可靠(浏览器可能传错) - 务必用
Part.getInputStream()读取,再用new String(bytes, StandardCharsets.UTF_8)解码,避免乱码 - 不要用
Part.write()临时写磁盘再读——多一次 I/O,且有权限/路径风险
@WebServlet("/upload")
@MultipartConfig(fileSizeThreshold = 1024 * 1024, maxFileSize = 10 * 1024 * 1024)
public class XmlUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
Part xmlPart = request.getPart("xmlFile"); // name="xmlFile" 来自 HTML 表单
String filename = xmlPart.getSubmittedFileName();
if (!filename.toLowerCase().endsWith(".xml")) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Only XML files allowed");
return;
}
<pre class='brush:php;toolbar:false;'> InputStream is = xmlPart.getInputStream();
byte[] bytes = is.readAllBytes(); // Java 9+
String xmlContent = new String(bytes, StandardCharsets.UTF_8);
// 此处可交给 DocumentBuilder 或 JAXB 解析
System.out.println("Received XML length: " + xmlContent.length());
} catch (ServletException e) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid multipart request");
}
}}
立即学习“Java免费学习笔记(深入)”;
常见错误:中文文件名乱码、空内容、NullPointerException
这些基本都源于对 multipart 结构理解偏差或编码处理遗漏。
-
getSubmittedFileName()在 Tomcat 8.5+ 默认 UTF-8,但旧版(如 7.x)需在server.xml的Connector加URIEncoding="UTF-8",否则中文名变???.xml -
request.getPart("xxx")返回null:确认 HTML 表单<input type="file" name="xxx">的name和后端一致;且表单enctype必须是multipart/form-data - 读出来 XML 内容为空:检查是否误调了
xmlPart.getSize() == 0,或流已被其他逻辑提前消费(getInputStream()只能调一次) - 解析时报
org.xml.sax.SAXParseException:大概率是 BOM 头或编码不匹配,建议先用Files.write(Paths.get("debug.xml"), bytes)保存本地用编辑器验证
如果必须用Apache Commons FileUpload
仅当无法升级 Servlet 版本时采用。注意它和原生 API 的行为差异:
- 不再用
request.getPart(),而是用ServletFileUpload.parseRequest(request)得到List<FileItem> -
FileItem.isFormField()区分普通字段和文件字段;XML 文件对应的是!isFormField() -
FileItem.getString("UTF-8")可直接获取字符串,但大文件易 OOM;推荐仍用FileItem.getInputStream() - 必须确保
web.xml没配<multipart-config>,否则会和 Commons 冲突报错
真正麻烦的从来不是“怎么读到 XML”,而是后续怎么安全地解析它——外部实体、XXE、超深嵌套、超大文本节点……这些得在拿到字符串之后立刻考虑。










