2013-08-13 11 views
5

Aby korzystać z lightboksa, potrzebuję linku do obrazu wygenerowanego przez <p:graphicImage>.Uzyskaj konkretny adres URL <p: graphicImage> zwracając StreamedContent

Ostatecznie HTML powinien wyglądać następująco:

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

To mój JSF próba tak daleko:

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

Jak uzyskać konkretny adres URL <p:graphicImage> powrocie StreamedContent tak, że mogę użyć go w moim linku?

+4

dobre pytanie. W przypadku poprawki szybkiej i złej, możesz z łatwością użyć do tego JS. Przy okazji, PrimeFaces ma już komponent '' '. Nie ma potrzeby korzystania z biblioteki innej firmy. – BalusC

Odpowiedz

1

to mieć jedno rozwiązanie - przy użyciu serwletu tutaj jest aplet, który będzie działał w każdym JSF aplikacji

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 

A oto kod strony internetowej

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

Ciesz

+0

To jest rozwiązanie, ale szukałem czegoś, co nie wymagałoby dodatkowego serwletu. –

+0

Żadne inne rozwiązanie, żadne inne rozwiązanie nie będzie oparte na serwletie, ponieważ całe JSF również oparte na serwletach, także każda aplikacja internetowa java powinna używać jakichś serwletów, tego rozwiązania użyłem w wielu projektach :) –

Powiązane problemy