2011-08-15 15 views
3

サーバからビデオファイルをストリーミングしようとしているときにサーブレットでこの問題に直面しています。 サーバにコードファイルサーブレット+ビデオストリーミング+ ClientAbortException

if (contentType == null) { 
     contentType = "application/octet-stream"; 
    } 

    response.reset(); 
    response.setBufferSize(ServerConfiguration.DEFAULT_BUFFER_SIZE); 
    response.setContentType(contentType); 
    response.setHeader("Content-Length", String.valueOf(file.length())); 
    response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\""); 
    response.setHeader("Cache-Control", "public") ; 


    BufferedInputStream input = null; 
    BufferedOutputStream output = null; 

     try { 
      // Open streams. 
      input = new BufferedInputStream(new FileInputStream(file), ServerConfiguration.DEFAULT_BUFFER_SIZE); 
      output = new BufferedOutputStream(response.getOutputStream(), ServerConfiguration.DEFAULT_BUFFER_SIZE); 

      // Write file contents to response. 
      byte[] buffer = new byte[ServerConfiguration.DEFAULT_BUFFER_SIZE]; 
      int length; 
      while ((length = input.read(buffer)) > 0) { 
       output.write(buffer, 0, length); 
      } 
     } 
     catch (Exception e) { 
      log(e); 
     } 
      finally { 
      // Gently close streams. 
      close(output); 
      close(input); 
     } 

私は「インライン」にコンテンツ配置を設定していると私は要求が無限ループ内のサーバーと、それはこれをスローするたびに来て見ることができますデバッグするときエラー:私は、添付ファイルコンテンツ配置の種類を変更した場合

ClientAbortException: java.io.IOException 
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369) 
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:327) 
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392) 
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381) 
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:93) 
at java.io.BufferedOutputStream.write(Unknown Source) 
at com.venividi.ResourceManager.UploadFileManager.getMediaFiles(UploadFileManager.java:118) 
at com.venividi.Servlet.VenividiServlet.doGet(VenividiServlet.java:182) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at com.venividi.Servlet.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:29) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) 
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:306) 
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:322) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1732) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Caused by: java.io.IOException 
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:208) 
at org.apache.coyote.http11.InternalAprOutputBuffer$SocketOutputBuffer.doWrite(InternalAprOutputBuffer.java:238) 
at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:84) 
at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:190) 
at org.apache.coyote.Response.doWrite(Response.java:533) 
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:364) 
... 28 more 

- 私は(データが正確であることを意味する)のファイルをダウンロードし、localsytemからファイルを再生することができていますが、このビデオを再生することはできませんよVLCを使ったファイル(URLを介して) (ネットワークストリームオプション)または私のカスタムiPhoneのメディアプレーヤー。

私はサーバーのような何かしたい - http://www.yo-yo.org/mp4/yu.mp4 ..私はVLCまたは私のiPhoneアプリのURLを与えることによってこのファイルを再生することができます..ファイルのウェブサイト(http://www.yo-yo.org/ MP4 /)..

ヨーヨーmp4ファイルが

でのレスポンスヘッダが受け入れ-範囲:バイト 接続:キープアライブ のContent-Length:7846115 のContent-Type:text/plainの;文字セット= UTF-8 日付:2011年8月15日18:01:12 GMT ETag: "32a000f-77b8e3-3bd314df3c340" キープアライブ:タイムアウト= 2 最終更新日:2003年5月9日金曜日01:39 :49 GMT サーバー:Apacheの/ 2.2.8(Fedoraの)

私のサーバーのレスポンスヘッダが

のCache-Controlありながら:公共 コンテンツディスポジション:インライン;ファイル名= "3648ef48-71bf-4393-9c0e-89fda68a683c.mp4" コンテンツの長さ:7846115 コンテンツタイプ:video/mp4 日付:2011年8月15日18:10:07 GMT サーバー:Apache-Coyote/1.1

いくつかの提案をしてください。私は上記の問題に対する解決策を持って任意のヘルプ

よろしく スーリヤ

答えて

3

を本当に感謝します。クロムはバイト範囲の要求を送信し、サーバーは1回の要求で完全なファイルを書き込むのではなく、そのような要求を処理する必要があります。

このリンクは便利です:Servlet Supporting Resume

+0

こんにちはスーリヤ私はまた、ビデオ・ストリーミングで同じ問題を持っていますので、あなたは、サンプルコードを投稿することができます。 BalusCリンクには、テキスト、画像、およびZipファイルのみを扱う例があります。しかし、私はビデオファイルを扱いたい。サーブレットのビデオファイルを扱うためのコードを書くためのいくつかのサンプルコードと方法を教えてください。 –

+0

BalusCコードはオーディオ/ビデオファイルのために働いてくれました。すべてのブラウザ/デバイス。 Javaのネットワーク化されたI/Oライブラリを使用してコードを最適化できますが、コード内のロジックは機能します – surya

+0

ありがとうSurya、私は試してみます –

関連する問題