Vaadin 7 - 即时下载动态创建的文件

Vaadin 7 - instant download of dynamically created file

我的情况是:使用 Vaadin 7.7.10,我点击生成的文件,生成后我想下载它。

我有生成器方法,即 returns byte[](如果需要,也可以轻松修改为任何 OutputStream),然后我从中创建 StreamResource。所以我已经准备好下载资源了,但是现在呢?

我认为不能使用 FileDownloader 的方法,因为每次显示页面时我都必须在实际单击扩展按钮之前生成文件(我不想这样做那个,因为它是非常昂贵的操作,只能按需使用。

我能够使用 Page.getCurrent().open(streamResource, null, false) 达到预期的效果,但是自 Vaadin 7 以来不推荐使用带有 Resource 参数的 .open,所以我不想依赖它。 .

是否有任何解决方法或其他方法?

Vaadin FileDownloader 可能仍然能够通过一些定制来处理这个问题。然而,我曾经用不同的方法创建了一个报告系统。这个想法是使用组件 BrowserFrameStreamResource 作为其构造函数参数。

文件生成开始 - 例如 - 通过点击一个按钮。当生成完成时,它会导致 byte[]。从 byte[] 创建一个 StreamSource 然后用于创建 StreamResouce 然后用作 BrowserFrame.

的内容

最后,这个 BrowserFrame 被添加到 ui 某处,导致浏览器做出反应。

在我的例子中,需要生成参数化的 PDF 报告,用户可以先预览,然后在需要时下载。我有一个提供 byte[] 的 PDF 生成器。浏览器从文件扩展名 .pdf 识别类型并打开 PDF 插件进行预览和下载。

您可以将任何二进制内容放入 byte[] 用于构造 BrowserFrame 并设置适当的文件扩展名。

你也可以在你的 ui 中有一些 Layout,例如 - 在后台生成文件时有一个进度指示器,BrowserFrame 组件在其中文件准备好后附上。

也许不是一个理想的方法,但我们可以先用虚拟资源初始化文件下载器

 new FileDownloader(
        new StreamResource(
            new StreamSource() {
              @Override
              public InputStream getStream() {
                return null;
              }},""));

然后将其设置为侦听器事件中的新资源。

fileDownoader.setFileDownloadResource(newResource)