2010-05-31 3 views
2

У меня есть сервлет построить ответ на запрос медиафайлов путем чтения файла с сервера:Прочтите видеоролик из сервлета на веб-странице?

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

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

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

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

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

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

response.setContentType("video/quicktime"); 

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

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

Тем не менее, отправил код сервлета честно сказал ужасно написано. Помимо неправильного использования doPost() обработка ресурсов ввода-вывода некорректна, каждая строка имеет свой собственный try/catch, исключения были подавлены, а плохая информация записана на stdout, InputStream#available() было неправильно понято, DataOutputStream был использован без ясной причины , InputStream никогда не закрывался и т. д. Нет, это, конечно, не так. Пожалуйста, ознакомьтесь с учебниками basic 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> 

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

+0

Привет Balus. Большое спасибо за ваши отзывы. Мое кодирование все еще слабо :) Я установил ContentType в видео/quicktime, и он действительно работает. Отлично. Там много, чтобы узнать от вас, ребята. Я попробую ваш пример. –

+0

Сколько пользователей вы ожидаете от этого сервлета одновременно? Вы уверены, что ввод/вывод, который вы собираетесь с созданием Fileinputstream, будет работать для нескольких параллельных запросов? –

+0

Должен признаться, что я новичок и amarteur. У вас есть хороший документ о параллельности? –

0

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

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

+0

Спасибо, Ник. Но мне нужно также играть в файл mov. –

1
<EMBED SRC="<your servlet hosting the movie>" WIDTH=100 HEIGHT = 196 AUTOPLAY=true CONTROLLER=true LOOP=false PLUGINSPAGE=http://www.apple.com/quicktime/"> 
+0

Привет, Райан, спасибо за вашу помощь. Но когда я пытаюсь это сделать, есть сообщение об ошибке, что для приложения плагина/октета-потока нет подключаемого модуля. ?? –

+0

HI Ryan, я пробовал это, но браузер сообщил, что отсутствует плагин для приложения/октета-потока ?? –

+0

попробуйте установить response.setContentType («video/quicktime») в ваш сервлет непосредственно перед получением выходного потока .. и слово предостережения .. глядя на ваш код. Я не думаю, что этот подход будет масштабироваться для более чем нескольких одновременных пользователей , –

Смежные вопросы