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
可能仍然能够通过一些定制来处理这个问题。然而,我曾经用不同的方法创建了一个报告系统。这个想法是使用组件 BrowserFrame
将 StreamResource
作为其构造函数参数。
文件生成开始 - 例如 - 通过点击一个按钮。当生成完成时,它会导致 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)
我的情况是:使用 Vaadin 7.7.10,我点击生成的文件,生成后我想下载它。
我有生成器方法,即 returns byte[]
(如果需要,也可以轻松修改为任何 OutputStream
),然后我从中创建 StreamResource
。所以我已经准备好下载资源了,但是现在呢?
我认为不能使用 FileDownloader
的方法,因为每次显示页面时我都必须在实际单击扩展按钮之前生成文件(我不想这样做那个,因为它是非常昂贵的操作,只能按需使用。
我能够使用 Page.getCurrent().open(streamResource, null, false)
达到预期的效果,但是自 Vaadin 7 以来不推荐使用带有 Resource
参数的 .open
,所以我不想依赖它。 .
是否有任何解决方法或其他方法?
Vaadin FileDownloader
可能仍然能够通过一些定制来处理这个问题。然而,我曾经用不同的方法创建了一个报告系统。这个想法是使用组件 BrowserFrame
将 StreamResource
作为其构造函数参数。
文件生成开始 - 例如 - 通过点击一个按钮。当生成完成时,它会导致 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)