Jetty,“servlet 没有多部分配置”问题

我正在编写文件传输处理程序。请求是多部分 HTTP 消息。该消息是正确的 - 在其他服务器上测试。


问题是 getParts() 调用上的“java.lang.IllegalStateException: No multipart config for servlet”。


测试代码:


@SuppressWarnings("serial")

@MultipartConfig

@WebServlet(urlPatterns={"/upload"}, name="upload")

public class FilesServlet extends HttpServlet

{

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException

    {

        resp.setContentType("text/plain");

        PrintWriter out = resp.getWriter();


        int i=0;

        for(Part part: req.getParts())

        {

            out.printf("Got part: name=%s, size=%d%n",part.getName(), part.getSize());

            part.write(String.format("part-%02d.dat",i++));

        }

    }

}

例外:


java.lang.IllegalStateException: No multipart config for servlet

    at org.eclipse.jetty.server.Request.getParts(Request.java:2327)

    at org.eclipse.jetty.server.Request.getParts(Request.java:2314)

    at com.rad.server.servlet.FilesServlet.doPost(FilesServlet.java:31)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)

    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:860)

    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)

    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)

    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)

    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)

    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)

    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)

    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)

jars 是:jetty-server-9.4.8 和 javax-servlet-api-3.10。


这里有什么问题?


胡子哥哥
浏览 598回答 2
2回答

牧羊人nacy

实际上,我没有找到为什么 @MultipartConfig 注释对我不起作用,但我在 i-net 上发现了一种工作正常的解决方法:     private static final MultipartConfigElement MULTI_PART_CONFIG = new MultipartConfigElement("c:/temp");        ...     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        String contentType = request.getContentType();        if(contentType != null && contentType.startsWith("multipart/")){           request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, MULTI_PART_CONFIG);           for(Part part: request.getParts()) { ... } ;        } else {              ...        }                }我认为此解决方案可能对遇到此类问题的开发人员有用

精慕HU

当您将 servlet 映射到路径时,为什么不配置它?handler.addServlet(UploadServlet.class, "/upload/*")  .getRegistration().setMultipartConfig(    new MultipartConfigElement("./tmp")  );到达此 servlet 的每个请求都将使用该属性进行丰富
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java