Для начала он запускает запрос 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
.