0

我的 JPF 控制器的一个操作构建了一个 PDF 文件,我想将此文件返回给用户,以便他可以下载它。

是否可以这样做,或者我是否被迫在某处写入文件并让我的操作转发到该文件的链接?请注意,出于安全原因,我想尽可能避免这种情况,因为我无法知道用户何时下载了文件,以便我可以删除它。

我试图访问 HttpServletResponse 但没有任何反应:

getResponse().setContentLength(file.getSize());
getResponse().setContentType(file.getMimeType());
getResponse().setHeader("Content-Disposition", "attachment;filename=\"" + file.getTitle() + "\"");
getResponse().getOutputStream().write(file.getContent());
getResponse().flushBuffer();
4

1 回答 1

0

我们有类似的东西,除了返回图像而不是 PDF;不过,我猜应该是一个类似的解决方案。

在 JSP 上,我们有一个IMG标签,其中src设置为:

<c:url value="/path/getImage.do?imageId=${imageID}" />

(我没有展示所有内容,因为我试图简化。)在你的情况下,也许它是一个链接,它href以类似的方式完成。

getImage.do显然映射到我们的 JPF 控制器。这是来自 JPFgetImage()方法的代码,这是您正在尝试处理的部分:

@Jpf.Action(forwards = {
    @Jpf.Forward(name = FWD_SUCCESS, navigateTo = Jpf.NavigateTo.currentPage),
    @Jpf.Forward(name = FWD_FAILURE, navigateTo = Jpf.NavigateTo.currentPage) })
public Forward getImage(final FormType pForm) throws Exception {
  final HttpServletRequest lRequest = getRequest();
  final HttpServletResponse lResponse = getResponse();
  final HttpSession lHttpSession = getSession();
  final String imageIdParam = lRequest.getParameter("imageId");

  final long header = lRequest.getDateHeader("If-Modified-Since");
  final long current = System.currentTimeMillis();

  if (header > 0 && current - header < MAX_AGE_IN_SECS * 1000) {
    lResponse.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
    return null;
  }

  try {
    if (imageIdParam == null) {
      throw new IllegalArgumentException("imageId is null.");
    }

    // Call to EJB, which is retrieving the image from
    // a separate back-end system
    final ImageType image = getImage(lHttpSession, Long
        .parseLong(imageIdParam));

    if (image == null) {
      lResponse.sendError(404, IMAGE_DOES_NOT_EXIST);
      return null;
    }

    lResponse.setContentType(image.getType());
    lResponse.addDateHeader("Last-Modified", current);
    // public: Allows authenticated responses to be cached.
    lResponse.setHeader("Cache-Control", "max-age=" + MAX_AGE_IN_SECS
        + ", public");
    lResponse.setHeader("Expires", null);
    lResponse.setHeader("Pragma", null);
    lResponse.getOutputStream().write(image.getContent());

  } catch (final IllegalArgumentException e) {
    LogHelper.error(this.getClass(), "Illegal argument.", e);
    lResponse.sendError(404, IMAGE_DOES_NOT_EXIST);
  } catch (final Exception e) {
    LogHelper.error(this.getClass(), "General exception.", e);
    lResponse.sendError(500);
  }
  return null;
}

实际上,我从这种方法中删除的内容很少,因为其中几乎没有什么需要隐藏以防窥探——代码非常通用,与图像有关,与业务逻辑无关。(我更改了一些数据类型名称,但没什么大不了的。)

于 2009-08-13T13:12:04.077 回答