我的方案是:使用 Vaadin 7.7.10 ,我有点击生成的文件,我想在生成后下载。
我有生成器方法,返回byte[]
(如果需要,也可以很容易地修改为任何OutputStream
),然后我从中创建StreamResource
。所以我已准备好下载资源了,但现在是什么?
我认为不能使用FileDownloader
的方法,因为每次在实际点击扩展按钮之前显示页面时我都必须生成文件(我不想这样做,因为这是非常昂贵的操作,只能按需使用。)
我能够使用Page.getCurrent().open(streamResource, null, false)
达到预期的效果,但是自Vaadin 7以来,.open
Resource
参数被弃用了,所以我不想依赖它... < / p>
是否有解决方法或其他方法?
答案 0 :(得分:1)
Vaadin FileDownloader
可能仍然能够通过一些自定义来处理这个问题。但是我曾经用不同的方法创建了一个报告系统。我们的想法是使用以BrowserFrame
作为构造函数参数的组件StreamResource
。
例如,通过单击按钮开始文件生成。当生成完成时,结果为byte[]
。从byte[]
创建了一个StreamSource
,然后用于创建StreamResouce
,然后将其用作BrowserFrame
的内容。
最后,这个BrowserFrame
被添加到某个地方,导致浏览器做出反应。
在我的情况下,需要生成参数化的PDF报告,用户可以先预览,然后在需要时下载。我有一个提供byte[]
的PDF生成器。浏览器识别文件扩展名.pdf
中的类型,并打开PDF插件进行预览&amp;下载。
您可以将任何二进制内容放到byte[]
用于构造BrowserFrame
并设置适当的文件扩展名。
你的ui中也可以有一些Layout
- 例如 - 当文件在后台生成时有一个进度指示器,当文件准备好时,BrowserFrame
组件附加到该指示符。
答案 1 :(得分:0)
也许不是一个理想的方法,但我们可以先用一个虚拟资源初始化文件下载器
new FileDownloader(
new StreamResource(
new StreamSource() {
@Override
public InputStream getStream() {
return null;
}},""));
然后将其设置为侦听器事件中的新资源。
fileDownoader.setFileDownloadResource(newResource)