2013-08-13 12 views
5

Um den Leuchtkasten zu verwenden, brauche ich einen Link zu dem Bild, wie von <p:graphicImage> generiert.Erhalten konkreter URL von <p: graphicImage> Zurückgeben von StreamedContent

Letztlich sollte die HTML wie folgt aussehen:

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

Das ist mein JSF Versuch so weit:

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

Wie kann ich die konkrete URL <p:graphicImage>StreamedContent bekommen, so dass der Rückkehr kann ich Benutze es in meinem Link?

+4

Gute Frage. Als Quick'n'Dirty Fix können Sie einfach JS dafür verwenden. Übrigens hat PrimeFaces bereits eine '' Komponente aus der Box. Keine Notwendigkeit, eine 3rd-Party-Bibliothek dafür zu verwenden. – BalusC

Antwort

1

Diese eine Lösung haben - mit Servlet hier ist ein Servlet, die

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 

in jeder JSF-Anwendung arbeiten und hier ist eine Web-Seite Code

<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}"/> 

Genießen

+0

Dies ist eine Lösung, aber ich suchte nach etwas, das kein zusätzliches Servlet benötigen würde. –

+0

Keine andere Lösung, jede andere Lösung wird auf Servlet basieren, weil das ganze JSF auch auf Servlets basiert, sollte auch irgendeine Java-Webanwendung irgendeine Art von Servlets verwenden, diese Lösung habe ich in vielen Projekten verwendet :) –