2013-08-13 38 views
5

Để sử dụng hộp đèn, tôi cần một liên kết đến hình ảnh được tạo bởi <p:graphicImage>.Nhận URL cụ thể của <p: graphicImage> quay lại StreamedContent

Cuối cùng, HTML sẽ trông như thế này:

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

Đây là nỗ lực JSF của tôi cho đến nay:

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

Làm thế nào để có được URL cụ thể của <p:graphicImage> trở StreamedContent để tôi có thể sử dụng nó trong liên kết của tôi?

+4

Tốt câu hỏi. Khi sửa chữa nhanh chóng, bạn có thể dễ dàng sử dụng JS cho việc này. Nhân tiện, PrimeFaces đã có thành phần ''. Không cần phải sử dụng thư viện của bên thứ ba cho điều đó. – BalusC

Trả lời

1

này có một giải pháp - sử dụng servlet đây là một servlet mà sẽ làm việc trong bất kỳ ứng dụng 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 

Và đây là một mã trang web

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

Thưởng thức

+0

Đây là một giải pháp, nhưng tôi đã tìm kiếm một cái gì đó mà sẽ không cần một servlet bổ sung. –

+0

Không có giải pháp khác, giải pháp khác sẽ dựa trên servlet, vì toàn bộ JSF cũng dựa trên servlet, cũng bất kỳ ứng dụng web java nào cũng nên sử dụng một số servlet, giải pháp này tôi đã sử dụng trong rất nhiều dự án. :) –