HttpServletRequest#getParts()jsp总是返回空集合

时间:2016-02-10 10:08:39

标签: java jsp tomcat7

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

这是我的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

1 个答案:

答案 0 :(得分:1)

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

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

为JSP页面执行此配置很棘手(不知道@MultipartConfig是否可以应用于JSP页面),但这是使用web.xml的解决方案:给定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");
   ...