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