2014-01-23 4 views
0

Я использую p:graphic image компонент простых граней в проекте jsf 2.0 с pf 3.3. Я реализовал его, как BalusC объяснил в суровых вопросах, таких как this. Он отлично работает в Internet Explorer и firefox, но в Google Chrome он исчезает, оставляя сломанную ссылку на изображение.p: graphicImage через какое-то время исчезает в google chrome

В Internet explorer; когда я сохраняю как изображение, оно называется untitled.png, и все в порядке.

В Internet explorer; когда я сохраняю как изображение, это называется dynamiccontent.xhtml.png, и все в порядке.

Но в Google Chrome его назвали dynamiccontent.xhtml, и даже если я изменяю расширение, изображение не видно.

создать изображение с помощью Java графической библиотеки как

BufferedImage bufferedimage = new BufferedImage(_width, _height, BufferedImage.TYPE_INT_RGB); 
Graphics2D g2d = bufferedimage.createGraphics(); 
.... 
g2d.dispose(); 

ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(bufferedimage, "png", os); 

return os; 

И мой XHTML, как:

<p:graphicImage value="#{imagesBean.image}"> 
    <f:param name="lilw" value="#{reportsLoadSheetBean.loadedIndexLandingWeight}" /> 
    <f:param name="litow" value="#{reportsLoadSheetBean.loadedIndexTakeOffWeight}" /> 
    <f:param name="lizfw" value="#{reportsLoadSheetBean.loadedIndexZeroFuelWeight}" /> 
    <f:param name="tl" value="#{reportsLoadSheetBean.topLimit}" /> 
    <f:param name="zfwf" value="#{reportsLoadSheetBean.zeroFuelWeightForward}" /> 
    <f:param name="zfwa" value="#{reportsLoadSheetBean.zeroFuelWeightAfter}" /> 
    <f:param name="towf" value="#{reportsLoadSheetBean.takeOffWeightForward}" /> 
    <f:param name="towa" value="#{reportsLoadSheetBean.takeOffWeightAfter}" /> 
    <f:param name="lwf" value="#{reportsLoadSheetBean.landingWeightForward}" /> 
    <f:param name="lwa" value="#{reportsLoadSheetBean.landingWeightAfter}" /> 
    <f:param name="width" value="600" /> 
    <f:param name="height" value="200" /> 
</p:graphicImage> 

и, наконец, применение области действия боба, который получает изображение и отправляет его к интерфейсу:

public StreamedContent getImage() throws IOException { 
    FacesContext context = FacesContext.getCurrentInstance(); 

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
     // So, we're rendering the view. Return a stub StreamedContent so 
     // that it will generate right URL. 
     return new DefaultStreamedContent(); 
    } else { 
     String lilw = context.getExternalContext().getRequestParameterMap().get("lilw"); 
     String litow = context.getExternalContext().getRequestParameterMap().get("litow"); 
     String lizfw = context.getExternalContext().getRequestParameterMap().get("lizfw"); 
     String tl = context.getExternalContext().getRequestParameterMap().get("tl"); 
     String zfwf = context.getExternalContext().getRequestParameterMap().get("zfwf"); 
     String zfwa = context.getExternalContext().getRequestParameterMap().get("zfwa"); 
     String towf = context.getExternalContext().getRequestParameterMap().get("towf"); 
     String towa = context.getExternalContext().getRequestParameterMap().get("towa"); 
     String lwf = context.getExternalContext().getRequestParameterMap().get("lwf"); 
     String lwa = context.getExternalContext().getRequestParameterMap().get("lwa"); 

     List<Number> zeroFuelWeightIntervals = new ArrayList<Number>(); 
     List<Number> takeOffWeightIntervals = new ArrayList<Number>(); 
     List<Number> landingWeightIntervals = new ArrayList<Number>(); 

     zeroFuelWeightIntervals.add(Double.valueOf(zfwf)); 
     zeroFuelWeightIntervals.add(Double.valueOf(zfwa)); 
     zeroFuelWeightIntervals.add(Double.valueOf(tl)); 

     takeOffWeightIntervals.add(Double.valueOf(towf)); 
     takeOffWeightIntervals.add(Double.valueOf(towa)); 
     takeOffWeightIntervals.add(Double.valueOf(tl)); 

     landingWeightIntervals.add(Double.valueOf(lwf)); 
     landingWeightIntervals.add(Double.valueOf(lwa)); 
     landingWeightIntervals.add(Double.valueOf(tl)); 

     int width = Integer.parseInt(context.getExternalContext().getRequestParameterMap().get("width")); 
     int height = Integer.parseInt(context.getExternalContext().getRequestParameterMap().get("height")); 

     IdealIntervalPointDiagram diagram = new IdealIntervalPointDiagram(
       "ZFL", Double.valueOf(lizfw), zeroFuelWeightIntervals, 
       "TOW", Double.valueOf(litow), takeOffWeightIntervals, 
       "LAW", Double.valueOf(lilw), landingWeightIntervals, 
       width, height); 

     ByteArrayOutputStream os = new ByteArrayOutputStream(); 

     try { 
      os = diagram.paint(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return new DefaultStreamedContent(new ByteArrayInputStream(os.toByteArray()), "image/png"); 
    } 

Может быть, это ошибка в связках?

ответ

1

Я нашел проблему. Речь идет о том, что хром Google проверяет заголовок content-length строго в ответе, включая изображение, и потому, что сервер сжимает изображение; фактический размер содержимого и размер, записанный в заголовке, не совпадают. Другой основной браузер игнорирует это несоответствие, но google chrome нет. поэтому я позвонил

FacesContext.getCurrentInstance().getExternalContext().setResponseContentLength(os.size()); 

перед возвратом изображения, и теперь он также отлично работает в Google Chrome.