0

私のJPFコントローラーのアクションの1つが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 コントローラーにマップされます。getImage()作業しようとしている部分であるJPF メソッドのコードを次に示します。

@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 に答える