【问题标题】:Streaming Dynamic Files from Spring MVC从 Spring MVC 流式传输动态文件
【发布时间】:2010-03-01 08:13:56
【问题描述】:

我有一个 Spring Web MVC 应用程序(还有一个 BlazeDS 应用程序,虽然不那么相关),其中文件是根据某些客户端操作动态生成的。

我只想将文件系统上的某个目录映射到 Spring MVC(或应用程序服务器)url,并让它为该目录中的文件提供服务(支持流式传输和标准的 last-modified 标头支持)。理想情况下,映射目录将通过 spring 配置进行配置,因为我已经支持每台机器进行设置。

那么,我该怎么做呢?到目前为止,我能找到的最好的方法是编写一个手动读取文件并逐字节流式传输的控制器。然而,这似乎远不理想。是否已经在 Spring MVC 或标准应用服务器规范中加入了对此类内容的支持?

谢谢!

【问题讨论】:

    标签: java spring file spring-mvc streaming


    【解决方案1】:

    如果您的处理模型支持它,为什么不将文件系统的中间人完全从图片中剔除,只在生成文件时通过响应流将文件流回?看一下 Spring MVC 的 AbstractExcelView 和 AbstractPDFView 类,看看如何做到这一点的一些例子。

    【讨论】:

    • 谢谢。生成需要很长时间(大约 10 秒)才能始终实时生成。不过,我也许可以从这些来源中派生出我自己的 AbstractStreamingFileView。
    【解决方案2】:

    还是标准的应用服务器规范?

    是的,有。由于您没有提及您使用的是哪一个,我将给出Tomcat-targeted 答案。您基本上需要做的就是在/conf/server.xml 中为/path/to/your/resources 添加一个Context 元素:

    <Context docBase="/path/to/your/resources" path="/resources" />
    

    这样他们就可以通过http://example.com/resources/...访问

    【讨论】:

    • 这可能有效......但是,我认为很难将目录的位置集成到我的 spring 配置中,以便它通过部署、构建脚本和通过 Eclipse 的本地开发人员机器工作.
    【解决方案3】:

    理想的情况是在您的应用服务器前使用轻量级代理服务器,例如 nginx 或 lighthttpd。您可以将其配置为提供静态内容,而无需调用您的应用。

    如果目录和文件如此动态,您可以在控制器上准备文件的真实路径,并使用标头将此文件路径提供给前端服务器。例如对于 nginx,它是一个 X-Accel-Redirect 标头。阅读更多相关信息(并关注其他 http 服务器的链接)there

    【讨论】:

    • 这当然是一个选项,但是,就像 BalusC 的 tomcat 选项一样,我认为这很难以易于在开发环境和服务器上工作的方式集成。
    • 对于开发环境,您可以使用字节到字节的输出,您可以轻松地为此创建一个控制器。但是在生产服务器上部署时,您可以将此控制器配置为仅包含标头的输出。
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2010-11-14
    • 2018-04-28
    相关资源
    最近更新 更多