RequestDispatcher.forward到媒体文件?

时间:2013-10-22 22:15:30

标签: java servlets coldfusion streaming requestdispatcher

我最近有一个issue to resolve并找到了解决方案,但如果我能以某种方式使用RequestDispatcher.forward将请求转发到媒体网址,那么该解决方案可能会大大简化。

从文档中可以看出它只支持servlet, JSP file, or HTML file。无论如何我尝试使用媒体网址并且它没有抱怨,但它没有返回正确的标题(例如mime类型),也许还有其他或其他错误的东西,但无论如何它没有按预期工作。

我是否可以将RequestDispatcher.forward与媒体网址一起使用,以便提供响应,就像直接向网络服务器请求媒体网址一样?

修改

我可以证明至少Content-Type是正确的,因为它为任何媒体文件返回Content-Type text/html; charset=iso-8859-1。此外,我已经尝试直接在Window Media Player中打开网址,它似乎是在开始播放之前下载整个视频,这是不可接受的。因此,我可以放心地假设forward不仅将控件交还给IIS,或者至少对于媒体文件不正确。

1 个答案:

答案 0 :(得分:2)

您找到的解决方案指向正确的方向,但我不了解coldfusion,但使用servlet可以非常轻松地完成同样的事情。

如果要使用RequestDispatcher.forward方法,则可以在forward方法中指定servlet url。 在该servlet中,您需要做的就是阅读媒体并使用OutputStream作为响应发送它。

例如:

在您的servlet doGetdoPost方法中 您只需根据媒体设置内容类型,阅读并发送即可。

下面是一个简单的示例,可用于将媒体作为来自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();
}