0

我有一个 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”的东西

我发现了一个类似的 stackoverflow 问题,它建议使用“Content-disposition”标头。不幸的是,我无法弄清楚如何让它工作(似乎并非所有浏览器都支持它)。

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

4

2 回答 2

1

我猜你有一个静态锚我 html href="reportPdf"

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

几乎就是这种方法:如何将 Wicket 的 DownloadLink 与动态生成的文件一起使用?

于 2014-03-17T13:18:47.080 回答
0

我通过向已安装的 URL 提供“文件名”参数来解决该问题,如下所示:

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

向 PageParameters 添加一个“文件名”参数,然后生成像 /reportPdf/0123someCustomerId_report 这样的 URL,浏览器会以我们用户喜欢的方式保存它。

也许有人想出了一个更好的解决方案,但到目前为止它工作得很好,我不必玩弄每个浏览器解释不同的 HTTP 标头。

于 2014-03-17T14:29:51.447 回答