إرجاع المحتوى الثنائي من إجراء JPF مع Portal Weblogic 10.2

StackOverflow https://stackoverflow.com/questions/1265989

سؤال

أحد تصرفات تحكم 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