Прочитать быстрый фильм из сервлета на веб-странице? - PullRequest
2 голосов
/ 31 мая 2010

У меня есть сервлет, который создает ответ на запрос медиа-файла, читая файл с сервера:

 File uploadFile = new File("C:\\TEMP\\movie.mov");
 FileInputStream in = new FileInputStream(uploadFile);

Затем запишите этот поток в поток ответов. У меня вопрос: как воспроизвести файл мультимедиа на веб-странице, используя тег embed или object, чтобы прочитать поток мультимедиа из ответа?

Вот мой код в сервлете:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getParameter("location"); 
    uploadFile(response); 
}

private void uploadFile(HttpServletResponse response) {
    File transferFile = new File("C:/TEMP/captured.mov"); 
    FileInputStream in = null;

    try {
        in = new FileInputStream(transferFile);
    } catch (FileNotFoundException e) {
        System.out.println("File not found"); 
    }

    try {
        System.out.println("in byes i s" + in.available());
    } catch (IOException e) {
    }

    DataOutputStream responseStream = null;

    try {
        responseStream = new DataOutputStream(response.getOutputStream());
    } catch (IOException e) {
        System.out.println("Io exception"); 
    }

    try {
        Util.copyStream(in, responseStream);
    } catch (CopyStreamException e) {
        System.out.println("copy Stream exception"); 
    }

    try {
        responseStream.flush();
    } catch (IOException e) {
    }

    try {
        responseStream.close();
    } catch (IOException e) {
    }
}

А вот HTML-страница, предложенная Райаном:

<embed SRC="http://localhost:7101/movies/transferservlet" 
    WIDTH=100 HEIGHT=196 AUTOPLAY=true CONTROLLER=true LOOP=false 
    PLUGINSPAGE="http://www.apple.com/quicktime/">

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 01 июня 2010

Для начала он запускает запрос GET, но сервлет прослушивает только POST запросы. Вам нужно выполнить эту задачу в методе doGet() вместо doPost().

Вам также необходимо указать веб-браузеру, какую именно информацию вы отправляете. Это должно быть сделано с заголовком HTTP Content-Type. Вы можете найти здесь обзор наиболее часто используемых типов контента (mime-типов). Вы можете использовать HttpServletResponse#setContentType(), чтобы установить его. В случае файлов Quicktime .mov тип содержимого должен быть video/quicktime.

response.setContentType("video/quicktime");

Кроме того, каждый медиаформат имеет свой собственный способ встраивания с использованием элемента <embed> и / или <object>. Вам необходимо ознакомиться с документацией поставщика мультимедийного формата для получения подробной информации о том, как его использовать. В случае файлов Quicktime .mov вам необходимо обратиться к Apple . Внимательно прочитайте этот документ. Он хорошо написан и справляется с кроссбраузерными неудобствами. Скорее всего, вы бы предпочли сделать это простым способом с помощью простого JavaScript для прозрачного преодоления несоответствий между пользователями.

<script src="AC_QuickTime.js" language="javascript"> </script>
<script language="javascript">
    QT_WriteOBJECT('movies/filename.mov' , '320', '240' , '');
</script>

Тем не менее, опубликованный код сервлета, честно говоря, написан ужасно. Помимо неправильно использованного doPost(), обработка ресурсов ввода-вывода некорректна, каждая строка имеет свой собственный try / catch, исключения подавляются и плохая информация записывается в стандартный вывод, InputStream#available() неправильно понимается, DataOutputStream InputStream никогда не был закрыт, и так далее. Нет, это, конечно, не так. Обратитесь к базовым учебникам по Java IO и basic Java Exception , чтобы узнать больше об их правильном использовании. Вот небольшое переписывание того, как должен выглядеть сервлет:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filename = URLDecoder.decode(request.getPathInfo(), "UTF-8");
    File file = new File("/path/to/all/movies", filename);

    response.setHeader("Content-Type", "video/quicktime");
    response.setHeader("Content-Length", file.length());
    response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");

    BufferedInputStream input = null;
    BufferedOutputStream output = null;

    try {
        input = new BufferedInputStream(new FileInputStream(file));
        output = new BufferedOutputStream(response.getOutputStream());

        byte[] buffer = new byte[8192];
        for (int length = 0; (length = input.read(buffer)) > 0;) {
            output.write(buffer, 0, length);
        }
    } finally {
        if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
        if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
    }
}

Отобразите это в web.xml следующим образом:

<servlet>
    <servlet-name>movieServlet</servlet-name>
    <servlet-class>com.example.MovieServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>movieServlet</servlet-name>
    <url-pattern>/movies/*</url-pattern>        
</servlet-mapping>

Приведенный выше пример JavaScript показывает, как именно вы должны его использовать. Просто используйте путь /movies и добавьте имя файла после этого, как /movies/filename.mov. request.getPathInfo() вернет /filename.mov.

1 голос
/ 31 мая 2010
<EMBED SRC="<your servlet hosting the movie>" WIDTH=100 HEIGHT = 196 AUTOPLAY=true CONTROLLER=true LOOP=false PLUGINSPAGE=http://www.apple.com/quicktime/">
0 голосов
/ 31 мая 2010

Наиболее широко поддерживаемый способ - встроить флеш-плеер (SWF) и вернуть FLV-файл из вашей программы.Flash автоматически выполнит потоковую передачу FLV-файла.

http://snipplr.com/view/288/flash-video-player-html-code/

...