сервлет + потоковое видео + ClientAbortException - PullRequest
3 голосов
/ 15 августа 2011

Я сталкиваюсь с этой проблемой с сервлетом, когда пытаюсь транслировать видеофайл с сервера.Код для сервера файл

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

Я установил content-disposition в значение 'inline' , и когда я отлаживаю, я вижу запрос, поступающий на сервер в бесконечном цикле, икаждый раз, когда он выдает эту ошибку:

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 (что означает данныеправильно), но я не могу воспроизвести этот видеофайл (через URL) с помощью проигрывателя VLC (опция сетевого потока) или моего собственного медиаплеера iphone.

Я хочу сделать что-то вроде сервера - http://www.yo -yo.org / mp4 / yu.mp4 .. я могу воспроизвести этот файл, указав URL-адрес VLC или моего веб-сайта приложения Iphone .. для файла (http://www.yo -yo.org / mp4 /) ..

Заголовок ответа файла mp4 йо-йо:

Диапазон принятия: байты. Соединение: Keep-Alive. Длина содержимого: 7846115 Тип содержимого: текст /равнина;charset = UTF-8 Дата: понедельник, 15 августа 2011 г. 18:01:12 GMT ETag: «32a000f-77b8e3-3bd314df3c340» Keep-Alive: timeout = 2 Последнее изменение: пт, 09 мая 2003 г. 01:39:49 GMT Сервер: Apache / 2.2.8 (Fedora)

, а заголовок ответа моего сервера:

Cache-Control: public Content-Disposition: inline;filename = "3648ef48-71bf-4393-9c0e-89fda68a683c.mp4" Длина содержимого: 7846115 Тип содержимого: видео / mp4 Дата: понедельник, 15 августа 2011 18:10:07 GMT Сервер: Apache-Coyote / 1.1

Пожалуйста, предоставьте некоторые предложения.Я буду очень признателен за любую помощь

С уважением Сурья

1 Ответ

3 голосов
/ 22 августа 2011

Я получил решение вышеупомянутой проблемы.Chrome отправляет запросы в диапазоне байтов, и сервер должен обрабатывать такие запросы, а не записывать полный файл в одном запросе.

Эта ссылка полезна: Резюме с поддержкой сервлета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...