VAADIN:具有重复文件名的StreamResource使用旧的StreamResource

时间:2018-10-12 07:34:49

标签: java vaadin vaadin8

我有一个视图,我有两个按钮。一个用于创建PDF文件,另一个用于预览生成的PDF文件。

创建文件的方法返回一个ByteArrayOutputStream,然后我将其另存为byte[]作为视图字段。

预览生成的文件的方法然后使用此byte[]并显示如下:

private void viewPDF() {

    final ByteArrayInputStream data = new ByteArrayInputStream(this.cancellationByteArray);

    final Window window = new Window();
    window.setHeight("95%");
    window.setWidth("95%");

    final StreamSource source = () -> data;

    final String fileName = "Cancellation";

    final StreamResource resource = new StreamResource(source, fileName);
    resource.setMIMEType("application/pdf");

    final BrowserFrame browserFrame = new BrowserFrame(null, resource);
    browserFrame.setWidth("100%");
    browserFrame.setHeight("100%");
    window.setContent(browserFrame);
    window.center();
    UI.getCurrent().addWindow(window);
}

有了这个,我注意到了一些奇怪的东西。当我生成PDF并预览时,一切都很好。但是,当我重新启动该应用程序,生成一个新的应用程序并再次对其进行预览时,我总是会首先看到旧的PDF,它是我首先生成的。再次单击预览按钮将显示我刚刚生成的那个。如果然后我再次生成新的PDF并单击“预览”,它将再次显示正确的PDF。因此,从这一点来看,该应用程序基本上可以按预期运行。

现在,我发现动态设置fileName的{​​{1}}参数可以解决该错误。例如,如果我生成这样的名称:

StreamResource

然后它将始终显示最新版本。

那么为什么它如此工作?浏览器是否缓存final String fileName = "Cancellation-" + this.DATE_FORMAT.format(new Date()); ,并且再次单击该按钮时,它看起来是否(如果已经有一个带有相同StreamResource的{​​{1}})?但是,在我看来,这不能解释为什么我在旧的PDF中循环的解决方法行之有效。

1 个答案:

答案 0 :(得分:0)

可能是浏览器在进行缓存吗?