【问题标题】:Downloading same excel file in other wicket pages在其他检票口页面下载相同的 excel 文件
【发布时间】:2021-01-21 19:36:46
【问题描述】:

我已将 wicket 1.x 迁移到 wicket 8.x。

我在下面添加了用于下载 excel 文件的代码,但在 excel 下载的所有其他页面中获得了第一个下载的文件。

ResourceLink<Object> excelLink =  new ResourceLink<>("excel", new ResourceReference("downloadExcel") {
            private static final long serialVersionUID = 1L;

            @Override
            public IResource getResource() {
                byte [] exBytes = null;
                try {
                    exBytes = new byte[0]; // Some excel file into byte format
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return new ByteArrayResource(fileFormat.getContextType(), exBytes, fileName);
            }
        });
excelLink.setOutputMarkupId(true);
excelLink.add(new Label("excelLabel", new ResourceModel("excelLabel")));
return excelLink;

我在所有其他页面中使用相同的 Excel 下载逻辑,在应用程序中所有页面中所有 Excel 文件的名称相同的所有页面中具有相同的 ResourceLink Id“excel”。

如果它正在维护缓存,那么如何清除缓存以在每个页面中下载正确的excel文件?

如果有人可以帮助我解决此问题,请告诉我,这将更加明显。

【问题讨论】:

  • 你试过调试getResource()吗?每次点击下载按钮时都会执行吗?如果没有尝试在两次下载之间清理浏览器缓存?
  • 是的,每次点击下载按钮时它都会执行。我已经尝试清除缓存,但是我首先下载的文件只有同一个文件才会在其他页面上的其他下载点击中获得下载。在我的情况下,其他页面中的文件名也相同。

标签: java spring wicket wicket-8


【解决方案1】:

要禁用此资源的缓存,您可以这样做:

 return new ByteArrayResource(fileFormat.getContextType(), exBytes, fileName) {
   @Override 
   protected void configureCache(final ResourceResponse data, final Attributes attributes) {
       data.setCacheDuration(Duration.NONE);
       super.configureCache(data, attributes);
   }
 };

【讨论】:

  • 我尝试使用上面的代码,但它不适用于我的情况。在我的情况下,其他页面中的文件名也相同。
  • 如果这是您的要求,您可以使用不同的文件名。我的代码只是设置了禁用缓存的正确响应标头。您可能需要清除在我的代码之前已经填充的浏览器缓存。
  • 我在文件名中添加了时间戳,以便在每次下载点击时使用不同的文件名。这解决了我的问题,因为所有页面文件名都相同。谢谢。
  • 嗨@mar​​tin,请为这个问题投票。希望这可以帮助其他人解决他们的问题。
【解决方案2】:

以上代码可以正常返回 Excel 文件。在这里,我发现了 excel 文件名的问题,其中 excel 文件的名称在我的应用程序的所有页面中都相同,因为它是在早期版本的 Wicket 中实现的,并且之前工作正常。但是在 wicket 从 1.x 迁移到 8.x 版本后,它会在单击下载 excel 文件时返回旧下载的 excel 文件。所以现在我在文件名中添加了时间戳,以便在每个页面上保留不同的文件名以供 excel 下载。

示例:之前文件名是“UserData.xls”,现在在文件名“UserData_10022021_021311.xls”中添加时间戳后(UserData_ddMMyyyy_HHmmss.xls)。这解决了我的用例问题。

我希望它可以帮助同样面临同样问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多