إرجاع المحتوى الثنائي من إجراء JPF مع Portal Weblogic 10.2
-
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;
}
لقد قمت بالفعل بإزالة القليل جدا من هذه الطريقة، لأن هناك القليل جدا في ما أحتاج إلى الاختباء من أعين القواعد - الرمز عام جميل، والقلق مع الصور، وليس مع منطق الأعمال. (قمت بتغيير بعض أسماء أنواع البيانات، ولكن لا توجد صفقة كبيرة).