RequestDispatcher.forward 到媒体文件?

2024-05-06

我最近有一个需要解决的问题 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(使用前将#替换为@)

RequestDispatcher.forward 到媒体文件? 的相关文章

随机推荐