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

时间:2017-11-14 09:36:24

标签: java vaadin vaadin7

我的方案是:使用 Vaadin 7.7.10 ,我有点击生成的文件,我想在生成后下载。

我有生成器方法,返回byte[](如果需要,也可以很容易地修改为任何OutputStream),然后我从中创建StreamResource。所以我已准备好下载资源了,但现在是什么?

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

我能够使用Page.getCurrent().open(streamResource, null, false)达到预期的效果,但是自Vaadin 7以来,.open Resource参数被弃用了,所以我不想依赖它... < / p>

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

2 个答案:

答案 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)