为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2021-10-13 10:11:05
我正在编写文件传输处理程序。请求是多部分 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。这里有什么问题?
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

实际上,我没有找到为什么 @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 {  

            ...

        }          

      }

我认为此解决方案可能对遇到此类问题的开发人员有用


查看完整回答
反对 回复 2021-10-13
?
精慕HU

TA贡献1845条经验 获得超8个赞

当您将 servlet 映射到路径时,为什么不配置它?


handler.addServlet(UploadServlet.class, "/upload/*")

  .getRegistration().setMultipartConfig(

    new MultipartConfigElement("./tmp")

  );

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


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 597 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信