为ResourceReference指定动态文件名(PDF)

时间:2014-03-17 12:15:13

标签: http pdf wicket content-type wicket-1.6

我有一个Wicket应用程序,允许用户生成PDF并在弹出窗口中打开它们。我像这样定义了自己的共享资源

public class PdfResourceReference extends SharedResourceReference {

   @Override
   public IResource getResource() {
       return new ByteArrayResource("application/pdf") {
        @Override
        protected byte[] getData(final Attributes attributes) {
            // generate the pdf and return byte[]
        }
       };
   }
}

在应用程序类中,我通过

安装它
mountResource("reportPdf", new PdfResourceReference());

一切正常,浏览器打开pdf。但问题是pdf文件的名称(一旦用户试图保存它)总是" reportPdf"。我们的用户希望根据报告类型或客户编号命名pdf。类似于" 0123someCustomerId_report.pdf"

我发现similar stackoverflow question建议使用" Content-disposition"头。不幸的是,我无法弄清楚如何使其正常工作(似乎并非所有浏览器都支持它)。

这类问题还有其他解决方案吗?是否可以使用带有动态(正则表达式)路径的挂载路径?

2 个答案:

答案 0 :(得分:1)

我猜你有href="reportPdf"的html静态锚。

请改用DownloadLink。在那里,您可以使用DownloadLink(String id, IModel<File> model, String fileName)指定文件名。从IModel返回PDF,最好是LoadableDetachableModel

这几乎就是这种方法:How to use Wicket's DownloadLink with a file generated on the fly?

答案 1 :(得分:0)

我通过提供&#34; filename&#34;来解决这个问题。安装的URL的参数如下:

mountResource("reportPdf/${filename}", new PdfResourceReference());

添加&#34;文件名&#34; PageParameters的参数然后生成像/ reportPdf / 0123someCustomerId_report这样的URL,浏览器以我们的用户喜欢的方式保存它。

也许有人提出了一个更好的解决方案,但到目前为止它的效果很好而且我没有必要使用每个浏览器解释不同的HTTP标头。