문제

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

눈에서 숨겨야 할 것이 거의 없기 때문에 실제로이 방법에서 거의 제거되지 않았습니다. 코드는 비즈니스 로직이 아닌 이미지와 관련하여 매우 일반적입니다. (일부 데이터 유형 이름을 변경했지만 큰 문제는 없었습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top