0

我正在尝试创建一个基于 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,我为调试添加的打印语句的输出也证实了这一点。

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

处理程序代码是这样的:

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

2 回答 2

0

解决方案:

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

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

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

这有点 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
于 2013-10-14T21:53:57.273 回答
0
public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {}

你在这里使用的是你使用doHandle的形式method="post"

于 2013-10-13T20:09:49.377 回答