p:media 不是 运行 由 servlet 提供的 mp3

p:media not running mp3 served by servlet

我在 C:/platform/musig.mp3 中有一个应用程序上下文之外的 MP3 音频文件。

我正在使用下面的 servlet 来提供服务。

public class AudioServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletOutputStream stream = null;
        BufferedInputStream buf = null;

        try {
            stream = response.getOutputStream();
            File mp3 = new File("C:/platform/music.mp3");

            response.setContentType("audio/mpeg");
            response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
            response.setContentLength((int) mp3.length());

            FileInputStream input = new FileInputStream(mp3);
            buf = new BufferedInputStream(input);
            int readBytes = 0;

            while ((readBytes = buf.read()) != -1) {
                stream.write(readBytes);
            }
        } finally {
            if (stream != null) {
                stream.close();
            }
            if (buf != null) {
                buf.close();
            }
        }
    }

}
<servlet>
    <servlet-name>audioServlet</servlet-name>
    <servlet-class>servlet.AudioServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>audioServlet</servlet-name>
    <url-pattern>/audio/*</url-pattern>
</servlet-mapping>

我在 <p:media> 中引用它如下:

<p:media id="media"
    value="/audio"
    player="quicktime" 
    width="200" 
    height="40">
    <f:param name="autoPlay" value="false" />
</p:media>

问题是我无法 运行 声音。如果我将音频文件放在应用程序上下文中(例如 /resources),它就可以工作。但是断章取意,根本行不通。

调用 servlet 时,控制台出现以下异常:

ClientAbortException: java.net.SocketException: Software Caused connection abort: socket write error

有人知道会发生什么吗?或者有没有另一种方法可以用我不知道的 "media" 组件 PrimeFaces 来播放 MP3?

喜欢这个代码框架:

*.xhtml

<p:media value="#{mediaBean.media}" width="250" height="225" player="quicktime"/>

@豆子

public class MediaBean {
       private StreamedContent media;
       public MediaController() {
             InputStream stream = new FileInputStream("C://filename.mp3");
             media = new DefaultStreamedContent(stream, "audio/mpeg");
       }
       public StreamedContent getMedia() { return media; }
}

在这个例子中我删除了其他代码以简化:

@ManagedBean(name = "mediaBean")
@RequestScoped
public class MediaBean{
    public StreamedContent getMedia() throws FileNotFoundException{
            return new DefaultStreamedContent(new FileInputStream("PATH_TO_MEDIA_FILE"),"audio/mpeg");
        }
   }
}

Choose the scope you based on your requirement,在我的情况下是请求。

作为解释关于

java.net.SocketException: Broken pipe

并且不关闭流帮助 this and this 个帖子。

我设法解决了 :) ...我曾经解决 0x5a4d 和 Balusc 的响应,代码 0x5a4d 被发布了一个范围错误,我在我的应用程序中使用 'Conversation Scope' 并启动一个例外...... Balusc 评论说答案不完整并且可以发布这个错误,这就是发生的事情......

然后我创建了一个单独的 Bean,仅用于使用 'Default Scope' 处理对 MP3 的请求,它起作用了……我的 class 就是这样。 .

@Named
public class AudioBean {
private StreamedContent media;
public AudioBean() throws FileNotFoundException {
      InputStream stream = new FileInputStream("C:\plataforma\music.mp3");
    media = new DefaultStreamedContent(stream, "audio/mpeg");
  }
public StreamedContent getMedia() { return media; }

}



和 *.xhtml

<p:media value="#{audioBean.media}" 
         width="250" 
         height="225" 
         player="quicktime"/>



谢谢大家的帮助!