Как передавать аудио/видео файлы, такие как MP3, MP4, AVI и т.д. С помощью сервлета

Я хотел бы передать свои аудио/видео файлы в Интернет с помощью сервлета.

Я сделал попытку со следующим сервлетом:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    File file = new File("/Users/myfolder/Documents/workspace/love.mp3");
    response.setContentType(getServletContext().getMimeType(file.getName()));
    response.setContentLength((int) file.length());
    Files.copy(file.toPath(), response.getOutputStream());
}

И следующий HTML:

<a href="/media" data-format="mp3 ogg">Click Here!</a>

Однако игрок просто загружает... loading... loading...

Как это вызвано и как я могу его решить?

Ответы

Ответ 1

Многие медиаплееры требуют, чтобы сервер поддерживал так называемые запросы диапазона HTTP. То есть он должен иметь возможность возвращать определенные части медиафайла по запросу с заголовком Range. Например, только байты с точно индексом 1000 до 2000 года в файле длиной 10 МБ. Это необходимо для многих медиаплееров, чтобы иметь возможность пропустить определенный диапазон медиапотока достаточно быстро и/или улучшить скорость буферизации, создав несколько соединений, каждый из которых запрашивает разные части файла.

Однако в вашем сервлете много дополнительного кода, который требует хорошего понимания спецификации HTTP Range. Обычно servletcontainer (Tomcat, JBoss AS, Glassfish и т.д.) Собственный сервлет по умолчанию уже поддерживает это. Поэтому, если есть способ опубликовать медиа-папку в Интернете по стандартным средствам, так что вам не нужно приводить в действие сервлет для этого, то я бы пошел по этому маршруту.

Непонятно, какой сервлетконтейнер вы используете, поэтому я возьму Tomcat в этом примере:

  • Просто отпустите love.mp3 файл в общедоступном веб-содержимом веб-проекта, чтобы он просто был доступен <a href="love.mp3"> без необходимости для всего сервлета.

  • Или, поместите файл love.mp3 в новую подпапку в папке Tomcat/webapps, например. Tomcat/webapps/media/love.mp3. Таким образом, он доступен <a href="/media/love.mp3">.

  • Или, поместите файл love.mp3 в другое место на диске, например. /path/to/media/love.mp3 и добавьте папку /media в новый контекст, добавив следующую строку в Tomcat /conf/server.xml:

    <Context docBase="/path/to/media" path="/media" />
    

    Таким образом, он доступен и для <a href="/media/love.mp3">.

В любом случае Tomcat самостоятельно DefaultServlet, который имеет надлежащую поддержку Range, будет использоваться для потоковой передачи содержимого.

Но если нет абсолютно никакого способа использовать собственный сервлет servletcontainer, тогда вам нужно переписать свой код сервлета таким образом, чтобы он правильно поддерживал Range. Вы можете получить вдохновение из примеров с открытым исходным кодом, таких как Tomcat DefaultServlet и OmniFaces FileServlet.

См. также: