我有一个视图,我有两个按钮。一个用于创建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中循环的解决方法行之有效。
答案 0 :(得分:0)
可能是浏览器在进行缓存吗?