提交multipart / form-data时,Servlet请求contenttype = null

时间:2013-10-13 12:24:43

标签: java html forms servlets file-upload

我正在尝试创建一个基于servlet的表单,允许用户将多个文件提交到后端服务器。

表单由多个文件选择器组成。

表单从一个servlet发送,以text / html的形式将其打印到输出流。 (很多页面取决于用户登录等)。

在浏览器中,html如下所示:

 <form action="https://localhost:8441/uploadtest" method="post" enctype="multipart/form-data" >

当我选择一个或多个文件并单击提交按钮时,请求将转发到右侧链接,但是我的文件上载处理程序无法处理数据,因为request.getContentType()为null。

我使用嵌入式jetty 9服务器来托管servlet。 servlet api版本是3.0。处理程序抛出一个异常,指示内容类型为null,这也是我为调试添加的print语句的输出所确认的。

我一直在寻找和现在正在寻找问题几个小时,我无法弄清楚为什么内容类型设置为null,即使表单提交了一个带有enctype的POST请求作为multipart / form-data。

处理程序代码是:

    @Override
public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {

    String contentType = request.getContentType();
    System.out.println(contentType);
    if (contentType != null && contentType.startsWith("multipart/form-data")) {
        baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, MULTI_PART_CONFIG);
    }
            //processing here.

2 个答案:

答案 0 :(得分:0)

public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {}

此处使用的doHandle与您使用method="post"

的形式相同

答案 1 :(得分:0)

解决方案:

使用firebug我设法验证HTML部分是否正确发送了表单。在将整个应用程序剥离为零之后,事实证明该请求在到达Jetty 9服务器之后的一段时间内丢失,然后降落到处理它的处理程序。

我设法通过将处理程序映射到“/”路径作为服务器上的第一个处理程序来“修复”它。解析请求时,它会检查目标路径是否为“/ files”,以及它是否为multipart / form-data。如果是这样,它会处理它,如果不是,它会忽略该请求。

此时,jetty默认处理会将非表单请求正确转发给服务器上的其余处理程序。

有点hacky,如果有人能告诉我为什么将文件处理程序映射到“/ files”(或任何)URL导致请求丢失它会很好但是现在至少我得到了它。

如果有人遇到同样的问题,这里是服务器配置中相关位的代码:

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    server.setHandler(contexts);
    new FileUploadHandler(contexts,"/");
    ServletContextHandler root = new ServletContextHandler(contexts,"/");
            //more servlets & handlers here. 

和处理程序本身:

 HttpServletResponse response) throws IOException, ServletException {
    if (!request.getPathInfo().equals("/files")) {
        return;
    }
    System.out.println(request.getContentLength());
    if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
        baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, MULTI_PART_CONFIG);
    } else {    
        response.sendRedirect(URL.INDEX.getURL());
    }
              //more processing here