p:媒体没有运行servlet提供的mp3

时间:2015-04-06 12:51:10

标签: jsf servlets primefaces media-player

我在应用程序上下文之外的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:软件导致连接中止:套接字写入错误

有没有人知道可能会发生什么?或者是否有其他方式使用&#34;媒体&#34;组件PrimeFaces我不知道?

2 个答案:

答案 0 :(得分:0)

像这样的代码框架:

*。XHTML

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

@Bean

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

而非关闭流帮助thisthis帖子。

答案 1 :(得分:0)

我设法解决:) ...我曾经解决过0x5a4d和Balusc的响应,代码0x5a4d被释放了一个范围错误,我在我的应用程序中使用了'Conversation Scope'并启动了异常。 .. Balusc评论说答案是不完整的,可以解决这个错误,那就是发生了什么......

然后我创建一个单独的Bean只用于处理带有'默认范围'的MP3请求,它工作了......我的课就是这样。

@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"/>



谢谢你们的帮助!