WebLogic Portalの10.2とJPFアクションからバイナリコンテンツを返します
-
13-09-2019 - |
質問
私の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;
}
コードがないビジネスロジックで、画像に関係し、かなり一般的であり - 私はのぞき見から非表示にする必要があることをそこにはほとんどがありますので、私は実際には、このメソッドからはほとんど削除しました。 (私はデータタイプ名の一部を変更しませんが、大したこと。)
所属していません StackOverflow