2009-07-13 2 views
3

데이터 파일을 받아서 서버에 저장하는 하나의 서블릿이있는 간단한 웹 앱이 있습니다. "apache commons FileUpload"라이브러리를 사용하고 있습니다. 내 로컬 서버에서 파일 업로드가 정상적으로 작동합니다 (Dev와 Prod 서버에 GlassFish를 사용하고 있습니다). 크기 파일을 업로드 할 수 있습니다.Apache Commons Glassfish 서버의 FileUpload 문제

다음
[#|2009-07-13T22:19:31.822+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|Let's try to do something with 
your request|#] 

[#|2009-07-13T22:19:31.823+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 0.00 mb of 87.64 mb|#] 

[#|2009-07-13T22:19:33.403+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 0.95 mb of 87.64 mb|#] 

[#|2009-07-13T22:19:34.109+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 1.91 mb of 87.64 mb|#] 

[#|2009-07-13T22:19:34.739+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 2.86 mb of 87.64 mb|#] 

[#|2009-07-13T22:19:35.371+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 3.82 mb of 87.64 mb|#] 

[#|2009-07-13T22:19:35.989+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 4.77 mb of 87.64 mb|#] 

[#|2009-07-13T22:19:36.938+0000|WARNING|sun-appserver2.1|javax.enterprise.system.stream.err|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=99b72ec5-047c-4a86-9160-994ea31848a2;|org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly 
     at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367) 
     at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
     at com.athena.video.upload.server.Fileuploader.getMultipartRequestFile(Fileuploader.java:109) 
     at com.athena.video.upload.server.Fileuploader.doPost(Fileuploader.java:47) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
     at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315) 
     at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
     at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
     at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
     at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
     at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
     at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
     at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) 
     at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) 
     at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
     at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
     at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
     at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
     at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380) 
     at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
     at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 
Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly 
     at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983) 
     at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887) 
     at java.io.InputStream.read(InputStream.java:85) 
     at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94) 
     at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64) 
     at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362) 
     ... 33 more 
|#] 

[#|2009-07-13T22:19:37.839+0000|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=19;_ThreadName=httpSSLWorkerThread-8080-1;_RequestID=528b60b2-7083-4f27-a1de-0c90df2a34f1;|WEB0777: Unblocking keep-alive exception 
java.lang.IllegalStateException: PWC4662: Request header is too large 
     at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:740) 
     at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:442) 
     at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.parseRequest(DefaultProcessorTask.java:694) 
     at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:577) 
     at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
     at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
     at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
     at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
     at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 

가 나는 또한 추가하려고 것입니다 : 여기

-XX:MaxPermSize=512m 
-Xmx1024m 

내 서블릿 코드입니다 : 여기 내 메모리 정보입니다

... 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    log.info("Let's try to do something with your request"); 
    getMultipartRequestFile(request); 
} 

// Handling uploaded file with commons-fileupload library 
private void getMultipartRequestFile(HttpServletRequest request){ 

    if(!ServletFileUpload.isMultipartContent(request))   // if not is multi part then exit this function 
     return; 

    FileItemFactory factory = new DiskFileItemFactory();  // Create a factory for file items 
    ServletFileUpload upload = new ServletFileUpload(factory); // Create a new file upload handler 

    //Create a progress listener 
    ProgressListener progressListener = new ProgressListener(){ 
     private long megaBytes = -1; 
      public void update(long pBytesRead, long pContentLength, int pItems) { 
       long mBytes = pBytesRead/1000000; 
       if (megaBytes == mBytes) { 
        return; 
       } 
       megaBytes = mBytes; 
       if (pContentLength == -1) { 
        log.info("So far, " + dec.format(pBytesRead/1024.0/1024.0) + " have been read."); 
       } else { 
        log.info("So far, " + dec.format(pBytesRead/1024.0/1024.0) + "\tof " + dec.format(pContentLength/1024.0/1024.0)); 
       } 
      } 
    }; 
    upload.setProgressListener(progressListener); 

    // Parse the request 
    try { 
     List items = upload.parseRequest(request); 

     // Process the uploaded items 
     Iterator iter = items.iterator(); 
     while (iter.hasNext()) { 
      FileItem item = (FileItem) iter.next(); 

      if (item.isFormField()) { 
       processFormField(item); 
      } else { 
       processUploadedFile(item); 
      } 
     } 
    } 
    catch (FileUploadException e) { 
     e.printStackTrace(); 
    } 
} 

// this is where all magic with the file will happen 
private void processUploadedFile(FileItem item){ 

    if (!item.isFormField()) { 

     String fieldName = item.getFieldName(); 
     String fileName = item.getName(); 
     String contentType = item.getContentType(); 
     boolean isInMemory = item.isInMemory(); 
     long sizeInBytes = item.getSize(); 

     log.info("Field name: " + fieldName + "\nFile Name: " + fileName + "\nContent type: " +contentType+ "\nSize: " + dec.format(sizeInBytes/1024.0/1024.0)); 

     // write uploaded file to hdd 
     File uploadedFile = new File(FILES_FOLDER + fileName); 

     try { 
      item.write(uploadedFile);   
      log.info("File location: " + FILES_FOLDER + fileName); 

     } catch (Exception e) { 
      log.warning("File cannot be writtet to the disc"); 
      e.printStackTrace(); 
     } 
    } 
} 
... 

그리고이 오류로 출력 to domain.xml :

<http-listener acceptor-threads="1" address="0.0.0.0" blocking-enabled="false" default-virtual-server="server" enabled="true" family="inet" id="http-listener-1" port="8080" security-enabled="false" server-name="" xpowered-by="true"> 
      <property name="maxPostSize" value="0"/> <!-- 0 means no max --> 
      <property name="proxiedProtocols" value="ws/tcp"/> 
</http-listener> 

왜 이런 일이 발생하는지 생각하십시오.

답변

1
java.lang.IllegalStateException: PWC4662: Request header is too large 

더 큰 버퍼를 사용하려면 HTTP 커넥터를 구성해야합니다.

HTTP Listener 설정에 "maxPostSize"매개 변수가 있어야합니다.

+0

아니요, 작동하지 않았습니다. 다음은 내 domain.xml 파일에있는 내용입니다. value = "0"/><0 -> 0은 최대 값을 의미하지 않음 -> Maksim

1

나는 단지 추측 할 수 있습니다. 두 서버에서 동일한 버전의 라이브러리/컨테이너를 사용합니까? 파일 업로드를 방해 할 수 있습니까 (아파치 도구를 사용하여 이름을 기억할 수 없습니다). 올바르게 업로드되었는지 확인하십시오. 수동으로 서블릿에서 업로드 된 본문을 잡고 서블릿 필터/기본 요청 파서가 손상되지 않았는지 확인할 수 있습니다.

나는 또한 이것을 찾았습니다 issue here. 기본적으로 업로드하는 동안 소켓 시간 초과로 인해 예외가 발생했습니다.

2

둘 모두에서 glassfish 서버의 버전을 확인하십시오. 나는 동일한 문제가 있었고 아파치 공유 파일 업로드는 글래스 피쉬 서버에 문제가 있다는 것을 알아 냈다. 3.1.2. 서버 버전 3.1.2.2 (빌드 5)로 업그레이드하면 파일 업로드 기능이 정상적으로 작동합니다.

다음 호를 참조하십시오. http://java.net/jira/browse/GLASSFISH-18444

+0

안녕하세요. 같은 문제지만 글래스 피 서버 3.1.2.2와 lib/install (commons-io-1.3.1 및 commons-fileupload-1.1.1)의 librairies를 사용하고 있습니다. ( –