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"/>
谢谢大家的帮助!
我在 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"/>
谢谢大家的帮助!