我在应用程序上下文之外的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我不知道?
答案 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
答案 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"/>
谢谢你们的帮助!