【问题标题】:Why Apache Tomcat does not see mp3 file?为什么 Apache Tomcat 看不到 mp3 文件?
【发布时间】:2015-07-04 20:29:09
【问题描述】:

我开发必须播放音乐的网站。但是tomcat没有看到我想听的mp3文件。

这是我的 internalAccountTemplate.xhtml

的一部分
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
    <h:head>
        <title><ui:insert name="title" /></title>
    </h:head>
    <h:body styleClass="defaultStyle" id="body">
        <audio id="customAudio" preload='none'> 
            <source src='templates/KnifeParty.mp3' type='audio/mpeg' /> 
        </audio>
    </h:body>
</f:view>
</html>

当我按下 播放 按钮时,我会收到下一条错误消息
/WEB-INF/templates/KnifeParty.xhtml Not Found in ExternalContext as a Resource

我的文件夹结构:

我还有 NewFile1.xhtml 可以完美运行。但是这个文件(NewFile1.xhtml)我在 Firefox 中打开而不是在 Tomcat 服务器上

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Xhtml work</title>
</head>
<body>
    <audio id="yourAudio" preload='none'> <source
        src='templates/KnifeParty.mp3' type='audio/mpeg' /> </audio>
    <a href="#" id="audioControl">play!</a>
    <script type="text/javascript">
        var yourAudio = document.getElementById('yourAudio'), ctrl = document
                .getElementById('audioControl');

        ctrl.onclick = function() {

            // Update the Button
            var pause = ctrl.innerHTML === 'pause!';
            ctrl.innerHTML = pause ? 'play!' : 'pause!';

            // Update the Audio
            var method = pause ? 'pause' : 'play';
            yourAudio[method]();

            // Prevent Default Action
            return false;
        };
    </script>
</body>
</html>

在网上我看到了类似的问题 (like this),有人说在 Tomcat 服务器上注册扩展

我写了 KnifeParty.mp3 文件的不同路径并更改了他的位置,但这没有帮助。

【问题讨论】:

  • 请阅读浏览器如何在 Web 请求中请求资源。首先,请求的 url 被评估(由 JSF)并呈现为正确的 HTML。然后浏览器将尝试抓取其他类型的内容,但这是在单独的请求中完成的,JSF 与它无关。正如@BalusC 在答案中指出的那样,无法解析资源的 url,因为浏览器无法公开访问该资源。所以不是tomcat的问题。

标签: jsf tomcat mp3


【解决方案1】:

/WEB-INF 中的资源不可公开访问。您需要将可公开访问的资源放在/WEB-INF 之外。 /WEB-INF 应该只用于配置文件、模板文件、包含文件、标记文件等,这些文件应该根本不能公开访问。

像这样将它移动到/WEB-INF 的父文件夹后,

WebContent
 |-- META-INF
 |-- WEB-INF
 `-- some.mp3

那么你可以参考如下:

<audio ...> 
    <source src="#{request.contextPath}/some.mp3" type="audio/mpeg" />
</audio>

您还可以使用 JSF 资源管理工具,方法是将其放置在 JSF 专用的 /resources 文件夹中(您应该已经拥有该文件夹以用于 JS/CSS/图像文件),就像这样,

WebContent
 |-- META-INF
 |-- WEB-INF
 `-- resources
      `-- audio
           `-- some.mp3

然后你可以在 EL 中使用#{resource} map 来引用它,如下所示:

<audio ...>
    <source src="#{resource['audio/some.mp3']}" type="audio/mpeg" />
</audio>

另见:

【讨论】:

  • src="#{request.contextPath}/some.mp3" - 只有这个有效。如果我的文件夹结构是as follows 并且我使用src="#{request.contextPath}/resources/audio/KnifeParty.mp3" 我得到next message。在这种情况下,&lt;source src="#{resources['audio/KnifeParty.mp3']}" type="audio/mpeg" /&gt; 呈现的 HTML 看起来像 &lt;source type="audio/mpeg"&gt;&lt;/source&gt;
猜你喜欢
  • 2011-09-19
  • 2011-01-31
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多