【问题标题】:Servlet request contenttype = null when submitting multipart/form-data提交 multipart/form-data 时 Servlet 请求 contenttype = null
【发布时间】:2013-10-21 03:07:57
【问题描述】:

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

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

表单从一个 servlet 以 text/html 格式打印到输出流。 (很多页面取决于用户是否登录等)

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

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

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

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

我已经搜索和寻找问题几个小时了,即使表单提交了一个 enctype 为 multipart/form-data 的 POST 请求,我也无法弄清楚为什么内容类型设置为 null。

处理程序代码是这样的:

    @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.

【问题讨论】:

  • 您使用的是 servlet 3.0 还是之前的 2.5?
  • Servlet api 3.0,包含在这个码头版本中。

标签: java html forms servlets file-upload


【解决方案1】:
public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {}

你在这里使用 doHandle 与你使用 method="post" 的形式一样

【讨论】:

  • 问题在于从网页收到的发布请求。不是来自 servlet 的响应。不过,感谢您抽出时间尝试并提供帮助。
  • 好的,如果您的问题已经解决,您可以将您的答案粘贴到此处...以供进一步使用..谢谢
  • 没有,我的意思是问题出在请求的 getContentType() 上,而不是响应上。
  • 当你完全改变你的答案时,请你至少留下一个注释吗?直到刚才我才注意到你重写了它。我将在主要帖子中澄清问题以回答这个问题。
【解决方案2】:

解决方案:

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

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

此时码头默认处理将非表单请求正确地转发到服务器上的其余处理程序。

这有点老套,如果有人能告诉我为什么将文件处理程序映射到“/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2022-12-16
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多