我的一个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();
有帮助吗?

解决方案

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

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

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

(我没有展示的一切,因为我试图简化。)在你的情况,也许这将是一个链接,其中href以类似的方式完成的。

getImage.do映射到我们的JPF控制器,很明显。下面是来自JPF getImage()方法,这是你想要的工作零件上的代码:

@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;
}

我实际上从这个方法去除很少,因为那里面有非常小的,我需要从窥探隐藏 - 该代码是非常通用的,关心的图像,不与业务逻辑。 (I改变了一些数据类型的名字,但没有大问题。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top