HttpServletRequest#getParts() jsp 总是 return 空集合

HttpServletRequest#getParts() jsp always return empty collection

我必须开发一个 jsp 来执行文件上传。我正在使用 Tomcat7 和 servlet-api 3.0。如果我从 Eclipse 中的服务器启动 Tomcat,则 jsp 运行良好,否则,如果我在 tomcat 中部署 war,则 jsp 不起作用。问题是 request.getParts() 总是返回一个空集合。
我做错了什么?

这是我的 jsp:

    <%@page import="javax.servlet.http.Part" %>
    <%@page import="java.util.Collection"%>

    <html>
    <head>
    </head>

    <body>
      <h1>Test File Upload</h1>
      <br/>

        <form action="test.jsp" name="fileForm" id="fileForm" method="post" enctype="multipart/form-data" >
            <input type="text" name="text-test" value="" />
            <input type="file" name="upload" />
            <input type="submit" id="commit" name="commit" value="Upload">
        </form>
<%
    try {
        Part part = request.getPart("upload");
        System.out.println(part == null ? "part upload is null" : "part upload size : " + part.getSize());
        Collection<Part> parts = request.getParts();
        System.out.println("parts size: " + parts.size());
        for (Part p: request.getParts()) {
            out.write("Part name: " + p.getName() + "<br/>\n");
            out.write("<br/>\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
%>
    </body>
    </html>

这是控制台输出:

part upload is null
parts size: 0

必须为 servlet 显式启用多部分功能,使用 web.xml 中的多部分配置或 @MultipartConfig 注释。

如果未启用 request.getParts() 将永远不会 return 非空集。 (请注意,对于从 Eclipse 启动的 Tomcat,我无法重现您的发现)。

为 JSP 页面做这个配置很棘手(不知道 @MultipartConfig 是否可以应用于 JSP 页面),但这里有一个使用 [=12] 的解决方案=]:鉴于您的 JSP 页面是 /test.jsp 您需要添加:

<servlet>
    <description></description>
    <servlet-name>testjsp</servlet-name>
    <jsp-file>/test.jsp</jsp-file>
    <multipart-config>
        <!-- enter your values -->
        <max-file-size>123456</max-file-size> 
        <max-request-size>123456</max-request-size>
        <file-size-threshold>123456</file-size-threshold>
    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>testjsp</servlet-name>
    <url-pattern>/test.jsp</url-pattern>
</servlet-mapping>

在您的 JSP 页面中,您还必须检查请求是否为多部分请求,否则 getParts() 会抛出错误:

<%
String contentType = request.getContentType();
if ((contentType != null) && contentType.startsWith("multipart/form-data"))
{
    Part part = request.getPart("upload");
   ...