我最近有一个需要解决的问题 https://stackoverflow.com/questions/19385223/how-to-transparently-stream-a-file-to-the-browser并找到了一个解决方案,但如果我能以某种方式使用该解决方案可能会大大简化RequestDispatcher.forward
将请求转发到媒体 URL。
从文档来看,它说它只支持servlet、JSP 文件或 HTML 文件 http://docs.oracle.com/javaee/5/api/javax/servlet/RequestDispatcher.html#forward%28javax.servlet.ServletRequest,%20javax.servlet.ServletResponse%29。无论如何,我尝试使用媒体 URL,它没有抱怨,但是它没有返回正确的标头(例如 mime 类型),并且可能存在或其他错误的东西,但无论如何它没有按预期工作。
有什么办法我可以使用RequestDispatcher.forward
带有媒体 URL,以便提供响应,就像直接向 Web 服务器请求媒体 URL 一样?
EDIT:
我可以证明至少Content-Type
是正确的,因为它正在返回Content-Type text/html; charset=iso-8859-1
对于任何媒体文件。另外,我尝试直接在 Window Media Player 中打开网址,但似乎在开始播放之前就下载了整个视频,这是不可接受的。因此我可以有把握地假设forward
不只是将控制权交还给 IIS,或者至少对媒体文件的控制不正确。
您找到的解决方案指向正确的方向,但我不知道coldfusion
,但是使用 servlet 可以很容易地完成同样的事情。
如果你想使用RequestDispatcher.forward
方法,然后您可以在转发方法中指定 servlet url。
在该 servlet 中,您需要做的就是读取媒体并使用OutputStream
作为回应。
例如:
在您的 servlet 中doGet
or doPost
方法
您只需根据您的媒体设置内容类型,阅读并发送即可。
下面是一个简单的示例,您可以使用它来发送媒体作为 servlet 的响应:
public void doGet(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("video/x-ms-wmx");
ServletContext ctx = getServletContext();
InputStream is = ctx.getResourceAsStream("/path/to/media/file");
int read = 0;
byte bytes[] = new byte[1024];
OutputStream os = response.getOutputStream();
while((read = is.read(bytes)) != -1) {
os.write(bytes, 0, read);
}
os.flush();
os.close();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)