从 .html post multipart/form-data 表单到 servlets 2.5 或 3.0 的请求中的空参数列表

Bru*_*des 1 java servlets file-upload apache-commons

我的问题是我在 .html 页面中有一个表单,它激活了一个名为 CodeSubmission 的 servlet。起初,我使用 3.0 API 实现(仅使用@WebServlet("/CodeSubmission")),但是每当 servlet 被激活时,请求就没有任何参数。所以我决定尝试一下,在一个全新的项目中使用 2.5 API(通过手动将 servlet 添加到 web.xml 文件),但同样,每当调用 servlet 时,请求都没有任何参数。

我还认为这是因为文件上传字段,但即使删除它后,选择字段也不会作为请求参数出现。

这是html表单代码:

<form action="CodeSubmission" method="POST" enctype="multipart/form-data">
<label for="compiler">Compilador:</label>
<select id="compiler">
    <option value="c">C</option>
    <option value="c++">C++</option>
    <option value="scala7">Scala 2.7.7</option>
    <option value="scala8">Scala 2.8.1</option>
    <option value="java5">Java 1.5</option>
    <option value="java6">Java 1.6</option>
</select>
<br /> 
<label for="code">Arquivo:</label>
<input id="code" type="file" size=80 />
<br /> 
<input type="submit" value="Enviar" />
</form>
Run Code Online (Sandbox Code Playgroud)

这是检查参数的测试代码:

    System.out.println("Length: "+request.getContentLength());
    System.out.println("Content Type: "+request.getContentType());
    System.out.println("Method: "+request.getMethod());
    Enumeration<String> attributeNames = request.getAttributeNames();
    System.out.println("Request Attributes");
    while (attributeNames.hasMoreElements()) {
        String name = attributeNames.nextElement();
        System.out.println(name + ": " + request.getAttribute(name));
    }
    Enumeration<String> paramNames = request.getParameterNames();
    System.out.println("Request Parameters");
    while (paramNames.hasMoreElements()) {
        String name = paramNames.nextElement();
        System.out.println(name + ": " + request.getParameter(name));
    }
Run Code Online (Sandbox Code Playgroud)

request.getParameterNames() 枚举的大小始终为 0。这是使用 Servlet 2.5 加载文件并选择一个选项后单击“Enviar”按钮时控制台中打印的内容:

Length: 44
Content Type: multipart/form-data; boundary=----WebKitFormBoundary4E3NYbsqXZZMWwcl
Method: POST
Request Attributes
Request Parameters
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 5

multipart/form-data有不同的参数编码方案。对于 servelt 2.5,您应该使用 commons-fileupload。使用 servlet 3.0,您仍然可以使用它,或者使用request.getPart(..). 您还应该使用@MultiPartConfig