2009-07-13 32 views
3

データファイルを受け入れてサーバーに保存する単純なWebアプリケーションが1つだけあります。私は "apache commons FileUpload"ライブラリを使用しています。私のローカルサーバ上でファイルアップロードがうまく動作します(私はDevとProdサーバ用にGlassfishを使用しています)。私は任意のサイズのファイルをアップロードすることができます。ここに私の記憶情報は、次のとおりです。ここでApache Commons GlassfishサーバーのFileUpload問題

-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(); 
     } 
    } 
} 
... 

そして、これはエラーで出力されます。ここでは

[#|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) 

は私も追加しようとしたものです私の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リスナーの設定に「maxPostSize」というパラメータが設定されている必要があります。

+0

いいえ、動作しませんでした。これは私のdomain.xmlファイルにあるものです: <プロパティ名= "maxPostSize"値= "0" /><! - 0何の最大を意味しない - > <プロパティ名= "proxiedProtocols" 値= "WS/TCP" /> Maksim

1

私は推測できます。両方のサーバーで同じバージョンのライブラリ/コンテナを使用していますか?ファイルアップロードを盗聴できますか(Apacheのツールを使用していますが名前を覚えることはできません)、正しくアップロードされているかどうかを確認してください。手動でサーブレットのアップロードされた本体を取得し、サーブレットフィルタ/デフォルトのリクエストパーサーからの破損がないかどうかを確認できますか?

私はこれを見つけましたissue here。基本的には、アップロード中にソケットタイムアウトが例外を引き起こしたと述べています。

2

両方のglassfishサーバーのバージョンを確認します。私は同じ問題を抱えていて、Apacheのコモンズファイルのアップロードにglassfishサーバーに関する問題があることを確認しました。私がサーバーバージョン3.1.2.2(ビルド5)にアップグレードすると、ファイルのアップロード機能が正常に動作します。

次の問題を参照してください。http://java.net/jira/browse/GLASSFISH-18444

+0

こんにちは、私がいます同じ問題ですが、私はglassfishサーバー3.1.2.2とlib/install(commons-io-1.3.1とcommons-fileupload-1.1.1)のlibrairiesを使用しています。 –

関連する問題