【问题标题】:Jetty, "No multipart config for servlet" problem码头,“没有 servlet 的多部分配置”问题
【发布时间】:2020-04-19 17:31:57
【问题描述】:

我正在为文件传输编写处理程序。请求是多部分 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)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:530)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
    at java.lang.Thread.run(Thread.java:745)

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

这里有什么问题?

【问题讨论】:

    标签: java multipartform-data jetty-9


    【解决方案1】:

    实际上,我没有发现为什么 @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 {  
                ...
            }          
          }
    

    我认为这个解决方案可能对面临此类问题的开发人员有用

    【讨论】:

      【解决方案2】:

      为什么在将 servlet 映射到路径时不进行配置?

      handler.addServlet(UploadServlet.class, "/upload/*")
        .getRegistration().setMultipartConfig(
          new MultipartConfigElement("./tmp")
        );
      

      到达此 servlet 的每个请求都将丰富该属性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-20
        • 2016-08-16
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        相关资源
        最近更新 更多