2015-01-16 1 views
1

게시 요청 파일 업로드를 처리하기 위해 httpcomponenets nio 서버를 사용합니다.httpcomponents nio 서버 처리기에서 게시물 요청을 구문 분석하는 방법은 무엇입니까?

다음은 샘플 코드입니다. params, 업로드 된 파일 등을 포함하여 데이터 바이트 배열에 완전한 데이터를 경계로 구분했습니다. 데이터를 구문 분석하고 매개 변수를 가져 오는 파서 유틸리티가 있습니까? request.getParameter ("PARAM1"), request.getFile() 등 (뿐만 아니라 모든 유형의 콘텐츠 처리) 구문 분석

public static void main(String[] args) throws Exception { 
     int port = 8280; 

     // Create HTTP protocol processing chain 
     HttpProcessor httpproc = HttpProcessorBuilder.create() 
      .add(new ResponseDate()) 
      .add(new ResponseServer("Test/1.1")) 
      .add(new ResponseContent()) 
      .add(new ResponseConnControl()).build(); 
     // Create request handler registry 
     UriHttpAsyncRequestHandlerMapper reqistry = new UriHttpAsyncRequestHandlerMapper(); 
     // Register the default handler for all URIs 
     reqistry.register("/test*", new RequestHandler()); 
     // Create server-side HTTP protocol handler 
     HttpAsyncService protocolHandler = new HttpAsyncService(httpproc, reqistry) { 

      @Override 
      public void connected(final NHttpServerConnection conn) { 
       System.out.println(conn + ": connection open"); 
       super.connected(conn); 
      } 

      @Override 
      public void closed(final NHttpServerConnection conn) { 
       System.out.println(conn + ": connection closed"); 
       super.closed(conn); 
      } 

     }; 
     // Create HTTP connection factory 
     NHttpConnectionFactory<DefaultNHttpServerConnection> connFactory; 

      connFactory = new DefaultNHttpServerConnectionFactory(
       ConnectionConfig.DEFAULT); 
     // Create server-side I/O event dispatch 
     IOEventDispatch ioEventDispatch = new DefaultHttpServerIODispatch(protocolHandler, connFactory); 
     // Set I/O reactor defaults 
     IOReactorConfig config = IOReactorConfig.custom() 
      .setIoThreadCount(1) 
      .setSoTimeout(3000) 
      .setConnectTimeout(3000) 
      .build(); 
     // Create server-side I/O reactor 
     ListeningIOReactor ioReactor = new DefaultListeningIOReactor(config); 
     try { 
      // Listen of the given port 
      ioReactor.listen(new InetSocketAddress(port)); 
      // Ready to go! 
      ioReactor.execute(ioEventDispatch); 
     } catch (InterruptedIOException ex) { 
      System.err.println("Interrupted"); 
     } catch (IOException e) { 
      System.err.println("I/O error: " + e.getMessage()); 
     } 
     System.out.println("Shutdown"); 
    } 
public static class RequestHandler implements HttpAsyncRequestHandler<HttpRequest> { 
    public void handleInternal(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException { 

     HttpEntity entity = null; 
     if (httpRequest instanceof HttpEntityEnclosingRequest) 
      entity = ((HttpEntityEnclosingRequest)httpRequest).getEntity(); 

     byte[] data; 
     if (entity == null) { 
      data = new byte [0]; 
     } else { 
      data = EntityUtils.toByteArray(entity); 
     } 

     System.out.println(new String(data)); 

     httpResponse.setEntity(new StringEntity("success response")); 
    } 

    @Override public HttpAsyncRequestConsumer<HttpRequest> processRequest(HttpRequest request, HttpContext context) throws HttpException, IOException { 
     return new BasicAsyncRequestConsumer(); 
    } 

    @Override 
    public void handle(HttpRequest request, HttpAsyncExchange httpExchange, HttpContext context) throws HttpException, IOException { 
     HttpResponse response = httpExchange.getResponse(); 
     handleInternal(request, response, context); 
     httpExchange.submitResponse(new BasicAsyncResponseProducer(response)); 

    } 
} 
+0

요청 엔터티 콘텐츠의 형식은 무엇입니까? URL로 인코딩 된 양식? Multipart form (MIME)? – oleg

+0

그것의 multipart/form-data. 서버에 파일을 업로드하려고합니다. –

답변

1

MIME 내용처럼 뭔가 아파치 HttpComponents의 범위를 벗어납니다. Apache Mime4J을 사용해보십시오.

+0

는 netty를 사용하여 종료했습니다. –