2013-10-13 2 views
0

사용자가 여러 파일을 백엔드 서버에 제출할 수있는 서블릿 기반 양식을 만들려고합니다.멀티 파트/양식 데이터를 제출할 때 Servlet request contenttype = null

양식은 여러 파일 선택기로 구성됩니다.

양식이 하나의 서블릿에서 인쇄되어 출력 스트림에 text/html로 전송됩니다. 내가 하나 개 이상의 파일을 선택하고 클릭하면

<form action="https://localhost:8441/uploadtest" method="post" enctype="multipart/form-data" > 

하는 버튼을 제출 브라우저에서

html로는 다음과 같습니다 (사용자 등으로 기록됩니다 어떠했는지에 페이지의 많은 의존) 요청은 올바른 링크로 전달되지만 request.getContentType()은 null이므로 내 파일 업로드 처리기는 데이터를 처리 할 수 ​​없습니다.

서블릿을 호스트하기 위해 임베디드 jetty 9 서버를 사용합니다. Servlet API 버전은 3.0입니다. 처리기는 콘텐츠 유형이 null임을 나타내는 예외를 throw하고 디버깅을 위해 추가 한 print 문 출력에 의해 확인됩니다.

지금은 몇 시간 동안 문제를 찾고있는 &을 찾고 있는데, 양식이 multipart/form-data처럼 enctype이 포함 된 POST 요청을 제출하더라도 콘텐츠 유형이 null로 설정된 이유를 알 수 없습니다.

핸들러 코드는 이것이다 :

@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

:

ContextHandlerCollection contexts = new ContextHandlerCollection(); server.setHandler(contexts); new FileUploadHandler(contexts,"/"); ServletContextHandler root = new ServletContextHandler(contexts,"/"); //more servlets & handlers here. 

및 핸들러 자체 :

경우 사용자가 동일한 문제를 겪고

, 여기에 서버 구성의 관련 비트 코드입니다 2.5 이전에? –

+0

Servlet API 3.0,이 jetty 버전에 포함됨. – Feone

답변

0
public void doHandle(String target, Request baseRequest, HttpServletRequest request, 
     HttpServletResponse response) throws IOException, ServletException {} 
여기

당신은 당신이 사용하는 형태로 doHandle이었다 사용 method="post"

+0

문제는 웹 페이지에서 게시 요청을 받았습니다. 서블릿의 응답이 아닙니다. 시도하고 도움을 주셔서 감사합니다. – Feone

+0

질문이 해결되면 여기에 붙여 넣을 수 있습니다 ... 추가 사용 ... thankyou – 3bu1

+0

그것은 문제가 아니고 응답의 getContentType()과 관련된 문제입니다. – Feone

0

해결 방법 : I 관리

사용하여 불을 지르고는 HTML 확인하기 부분이 양식을 올바르게 보냈습니다. 전체 응용 프로그램을 아무 것도 벗겨 낸 후에 요청을 처리하는 처리기에 착륙하기 전에 요청이 Jetty 9 서버에 도착한 후 잠시 시간이 지났음이 드러났습니다.

처리기를 서버의 첫 번째 처리기로 "/"경로에 매핑하여 "수정"할 수있었습니다. 요청을 구문 분석 할 때 대상 경로가 "/ files"이고 multipart/form-data인지 확인합니다. 그렇게 처리하면 처리하고, 그렇지 않으면 요청을 무시합니다.

이 시점에서 부두 기본값 처리는 비 형식 요청을 서버의 나머지 처리기로 올바르게 전달합니다.

좀 해킹 된 사람이라면 누구나 파일 처리기를 "/ files"(또는 임의의) URL에 매핑하면 요청을 잃게되므로 대단 할 것입니다.하지만 적어도 지금은 제대로 작동하고 있습니다. . 당신은 서블릿 3.0 이상을 사용하고

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 
관련 문제