【问题标题】:Get concrete URL of <p:graphicImage> returning StreamedContent获取返回 StreamedContent 的 <p:graphicImage> 的具体 URL
【发布时间】:2013-08-15 12:23:19
【问题描述】:

为了使用灯箱,我需要一个指向由&lt;p:graphicImage&gt; 生成的图像的链接。

最终,HTML 应如下所示:

<a href="image.jpg" data-lightbox="bilder">
  <img src="image.jpg" />
</a>

这是我迄今为止的 JSF 尝试:

<h:outputLink data-lightbox="bilder" value="???">
  <p:graphicImage value="#{imageStreamer.image}">
    <f:param name="imageId" value="#{gameReader.game.cover.id}"/>
  </p:graphicImage>
</h:outputLink>

如何获取返回 StreamedContent&lt;p:graphicImage&gt; 的具体 URL,以便在我的链接中使用它?

【问题讨论】:

  • 好问题。作为快速的'n'dirty修复,您可以轻松地为此使用JS。顺便说一句,PrimeFaces 已经有一个开箱即用的&lt;p:lightBox&gt; 组件。无需为此使用 3rd 方库。

标签: jsf url primefaces graphicimage


【解决方案1】:

这有一个解决方案 - 在这里使用 servlet 是一个 servlet,它可以在任何 jsf 应用程序中工作

package com.dossier.web.handlers;

//~--- non-JDK imports --------------------------------------------------------



import com.dossier.backend.services.mongo.FileService;
import com.mongodb.gridfs.GridFSDBFile;

//~--- JDK imports ------------------------------------------------------------

import java.io.*;

import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;

/**
 *
 * @author Armen Arzumanyan
 */
@WebServlet(urlPatterns = { "/PreviewImage" })
public class PreviewImage extends HttpServlet implements SingleThreadModel {
    private static final long serialVersionUID = -6624464650990859671L;
    private FileService       fileAction       = new FileService();

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPreviewImage(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {}

    private void doPreviewImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
        FacesContext context   = FacesContext.getCurrentInstance();
        String       fileIdStr = request.getParameter("fileId");
        String       widthStr  = request.getParameter("w");
        GridFSDBFile file      = null;
        int          width     = 0;

        if ((widthStr != null) && (widthStr.length() > 0)) {
            try {
                width = Integer.parseInt(widthStr);
            } catch (NumberFormatException e) {}
        }

        if (fileIdStr != null) {
            if (fileAction != null) {
                file = fileAction.getFile(fileIdStr.trim());
            }

            if (file != null) {
                byte[] content = IOUtils.toByteArray(file.getInputStream());

                if (content != null) {
                    String mimeType = file.getContentType();

                    response.addHeader("Pragma", "cache");
                    response.addHeader("Cache-Control", "max-age=3600, must-revalidate");
                    response.addDateHeader("Expires", System.currentTimeMillis() + 1000 * 3600 * 10);
                    response.setContentType(mimeType);

                    try {
                        if (((mimeType != null)
                                && (mimeType.equalsIgnoreCase("image/gif") || mimeType.equalsIgnoreCase("image/x-png")
                                    || mimeType.equalsIgnoreCase("image/png") || mimeType.equalsIgnoreCase("image/jpg")
                                    || mimeType.equalsIgnoreCase("image/jpeg"))) || (width == 0)) {
                            response.getOutputStream().write(content);
                        } else {

//                          ByteArrayInputStream bi = new ByteArrayInputStream(content);
//                          InputStream thumbStream = scaleImageJPG(bi, width);
//                          byte[] thumbContent = new byte[thumbStream.available()];
//                          thumbStream.read(thumbContent);
                            response.getOutputStream().write(content);
                        }
                    } catch (IOException e) {

                        // log.error("file content send error");
                        e.printStackTrace();
                    } catch (Exception e) {

                        // log.error("file exception: " + e);
                        e.printStackTrace();
                    } finally {
                        content = null;
                        file    = null;
                    }

                    return;
                }
            } else {

                // TODO add page not found
                response.addHeader("Pragma", "no-cache");
                response.addDateHeader("Expires", System.currentTimeMillis() - 1000 * 3600);

                try {
                    response.getWriter().println("file object is null");
                } catch (Exception e) {}

                return;
            }
        }

        // TODO add page not found
        response.addHeader("Pragma", "no-cache");
        response.addDateHeader("Expires", System.currentTimeMillis() - 1000 * 3600);

        try {
            response.getWriter().println("file id is not set");
        } catch (Exception e) {}

        // log.debug("file ID parameter is not set or file is not found");
        return;
    }

    // </editor-fold>
}


//~ Formatted by Jindent --- http://www.jindent.com

这是一个网页代码

<h:graphicImage id="primage" styleClass="img-rounded img-responsive"
                                                                url="/PreviewImage?w=250&amp;fileId=#{updatePersonBean.person.imageId}"
                                                                width="250" rendered="#{updatePersonBean.person.imageId != null}"/>                                              
                                                <h:graphicImage id="primagenew" styleClass="img-rounded img-responsive"
                                                                url="/resources/img/userpic_simple.gif"
                                                                width="250" rendered="#{updatePersonBean.person.imageId == null}"/>

享受

【讨论】:

  • 这是一个解决方案,但我正在寻找不需要额外 servlet 的东西。
  • 没有其他解决方案,任何其他解决方案都将基于servlet,因为整个JSF也是基于servlet的,任何java web应用程序都应该使用某种servlet,这个解决方案我在很多项目中都使用过.:)
【解决方案2】:

无需实现新 bean 的简单方法是输出不可见的 graphicImage 并使用 Javascript 复制 URL:

<h:form id="myForm">
    <p:graphicImage id="urlOutputter" value="#{MyForm.image}" style="display: none;"/>
    <span id="imageData" data-image="***URL HERE***"/>
    <script>
        var url = document.getElementById("myForm:urlOutputter").src;
        document.getElementById("imageData").setAttribute("data-image", url);
    </script>

【讨论】:

    【解决方案3】:

    已建议solution to this question here

    长话短说,您可以使用GraphicImageRenderergetImageSrc 方法来获取图像URI。

    第一步是扩展GraphicImageRenderer 以发布受保护的getImageSrc 方法:

    public class GraphicImageRendererXtension extends GraphicImageRenderer {
        // publish the protected GraphicImageRenderer#getImageSrc method:
        public String getPublicImageSrc(FacesContext context, GraphicImage image) throws Exception {
            return getImageSrc(context, image);
        }
    }
    

    我们需要一个托管 bean 中的方法,使我们能够使用 getPublicImageSrc 方法:

    public class MyBean {
      // ...
      public String getImgUri(GraphicImage imgComponent) throws Exception {
        assert null != imgComponent;
        String imgUri = new GraphicImageRendererXtension().getPublicImageSrc(FacesContext.getCurrentInstance(),
                    imgComponent);
        return imgUri;
      }
    }
    

    最后,我们将p:graphicImage 组件绑定到任意变量并调用myBean.getImgUri 来获取Uri 用于任何目的:

    <h:outputLink value="#{myBean.getImgUril(myImage)}">
            <p:graphicImage binding="#{myImage}" value="#{myBean.img}" />
    </h:outputLink> 
    

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 2012-01-08
      • 2019-07-25
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多