我正在尝试创建一个基于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.
答案 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