2011-08-15 3 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을 통해) 어 (네트워크 스트림 옵션) 또는 내 사용자 정의 아이폰 미디어 플레이어.

나는 서버와 같은 것을하고 싶다 - http://www.yo-yo.org/mp4/yu.mp4 .. 나는이 파일을 VLC 나 내 아이폰 앱에 URL을 제공하여 재생할 수있다. 파일 (http://www.yo-yo.org/) MP4 /) ..

요요 MP4 파일의 응답 헤더가

수락-범위이다는 : 연결 바이트 : 연결 유지 콘텐츠 길이를 : 7,846,115 콘텐츠 유형 : 텍스트/일반 ; charset = UTF-8 날짜 : 2011 년 8 월 15 일 월요일 18:01:12 GMT ETag : "32a000f-77b8e3-3bd314df3c340" Keep-Alive : timeout = 2 최종 수정 : Fri, 2003 년 5 월 9 일 01:39 49 GMT 서버 : 아파치/2.2.8 (페도라)

내 서버의 응답 헤더가

캐시 제어 동안 : 공공 내용 - 처리 : 인라인; 파일 이름 : "3648ef48-71bf-4393-9c0e-89fda68a683c.mp4" 콘텐츠 길이 : 7846115 콘텐츠 유형 : 동영상/mp4 날짜 : 2011 년 8 월 15 일 월요일 18:10:07 GMT 서버 : Apache-Coyote/1.1

몇 가지 제안 사항을 제공해주십시오. 난 정말 어떤 도움

감사 수르야

답변

3

내가 위의 문제에 대한 해결책을 가지고 감사합니다. 크롬은 바이트 범위 요청을 보내고 서버는 단일 요청으로 전체 파일을 작성하지 않고 이러한 요청을 처리해야합니다.

이 링크는 도움이 될 것입니다 : Servlet Supporting Resume

+0

안녕 수르야, 나는 또한 해요 비디오 스트리밍에 같은 문제가 있기 때문에 당신이 예제 코드를 게시 할 수 있습니다. BalusC 링크에는 텍스트, 이미지 및 Zip 파일 만 처리하는 예제가 있습니다. 하지만 비디오 파일을 다루고 싶습니다. 서블릿에서 비디오 파일을 처리하는 코드를 작성하는 몇 가지 예제 코드와 방법을 공유 할 수 있습니까? –

+0

BalusC 코드는 오디오/비디오 파일 용으로 작동했습니다. 모든 브라우저/장치에서. Java의 네트워크 I/O 라이브러리를 사용하여 코드를 최적화 할 수 있지만 코드의 로직은 작동합니다 – surya

+0

감사합니다 Surya, 시도 할 것입니다. –