2012-03-01 14 views
11

Używam streamedcontent renderować bajt wysyłany z JSF następnie odesłać go jako strumieniowej treści jak następuje:graphicimage nie renderowania streamedcontent w Primefaces

<p:graphicImage value="#{manage.bytesToStreamedContent(car.image)}"/> 

gdzie obraz jest tablica bajtów obrazu przechowywanego w baza

backing bean:

public StreamedContent bytesToStreamedContent(byte[] bytes) 
{ 
    InputStream is = new ByteArrayInputStream(bytes); 
    StreamedContent image = new DefaultStreamedContent (is, "image/jpeg"); 
    return image; 
} 

Ale ja nie dostaję obraz na stronie JSF. Ten komunikat pojawia się w dzienniku serwera:

OSTRZEŻENIE: JSF1091: Nie znaleziono typu mime dla pliku dynamiccontent. Aby rozwiązać ten problem, dodaj mapowanie typu mime do aplikacji web.xml.

oraz:

SEVERE: Error in streaming dynamic resource. 

można proszę mi pomóc, nie mogę znaleźć żadnych użytecznych informacji dotyczących tej kwestii

PS:

Im przy użyciu następujących bibliotek:

Mojarra 2.1.3

PrimeFaces 3.1.1

GlassFish 3.1

+0

możliwe duplikat [Problemy wyświetlających obraz w bazie danych blob Primefaces graphicimage] (http://stackoverflow.com/questions/10073905/problems-displaying-database-blob-image-in -primefaces-graphicimage) – BalusC

+0

Podobne/zduplikowane pytania: http://stackoverflow.com/questions/8207325/display-image-from-database-with-pgraphicimage/, http://stackoverflow.com/questions/10073905/problems- displaying-database-blob-image-in-primefaces-graphicimage, http://stackoverflow.com/questions/10944673/how-to-use-pgraphicimage-with-defaultstreamedcontent-in-an-uirepeat/, http: // stackoverflow .pl/questions/8304967/how-to-use-pgraphicimage-with-streamedcontent-within-pdatatable/ – BalusC

+1

@BalusC, ale ten post jest starszy niż niektóre z "powiązanych" pytań, o których wspomniałeś !!! – fareed

Odpowiedz

10

Znaleziono, gdzie był problem. Problem nie był na graficznym obrazku. Dzieje się tak dlatego, że tag graficzny jest ładowany dynamicznie (podobny problem przy próbie ładowania z datatable). Dynamiczne obrazy nie mogą być renderowane bezpośrednio w datatable lub datagrid. (Obejście polega na przypisaniu parametru i wywołaniu obrazów z identyfikatora).

Jednak rozwiązanie to here

3

W ogóle, to nie jest dobry pomysł, aby utworzyć StreamedContent w getter dla graphicimage. Obraz zostanie pobrany w oddzielnym żądaniu od reszty treści, co oznacza, że ​​zmienne zależne od iteratorów nie będą działać. Oznacza to, że w odpowiednim wywołaniu bytesToStreamedContent tablica bajtów będzie pusta. Jeśli umieścisz punkty przerwania w metodzie, prawdopodobnie zobaczysz, że w ostatnim wywołaniu nie ma danych w bajtach.

Musisz upewnić się, że obraz jest generowany, dopóki nadal masz dostęp do wszystkich potrzebnych treści, a następnie zapisać go w taki sposób, aby odzyskać go ponownie w bajtach. To, czy rozwiąże problem i faktycznie zadziała, jest trudne do powiedzenia bez oglądania reszty kodu. Zacznę od próby usunięcia argumentu tablicy bajtów i zwrócenia statycznego obrazu, aby potwierdzić, że to jest problem.

+0

bajty pochodzą z bazy danych w pierwszej kolejności i przekazywane do JSF. Następnie z JSF im wysyłając żądanie, aby pokazać jako strumień treści, aby wyświetlić obraz. Jednak próbowałem odczytać plik jako dane wejściowe z pliku sourceFiles aplikacji i utworzyć dodatek do treści streamedContent, ale nadal nie był on renderowany. Na koniec próbowałem pobrać plik bezpośrednio ze statycznego źródła w następujący sposób: i tym razem udało się to pomyślnie. Co myślisz? – fareed

+0

jeśli używasz czegoś takiego jak InputStream is = new FileInputStream ("C: \ images \ lemontree.jpg"); nie pomaga, naprawdę nie mam zielonego pojęcia, co jest nie tak. Najczęściej interesuje mnie tylko to, że parametr car.image nie działa tak, jak ci się wydaje. – MatsT

4

To jest dziwny problem i nie sądzę, że dodanie typu mime do pliku web.xml naprawi go. jest wymieniony jako zarówno błąd w PrimeFaces z tarczą 3,2

http://code.google.com/p/primefaces/issues/detail?id=3546

I jest również podawany jako otwarty błędu w Mojarra 2.1.1. Do tego błędu przesłano łatkę, ale wygląda na to, że będziesz musiał ręcznie zastosować kod do źródła Mojarra 2.1.1 i skompilować go. Można by pomyśleć, że zostanie to naprawione w 2.1.3, jednak Glassfish może mieć swoją własną wstępną implementację Mojarra, która wciąż jest w wersji Earlera, a Twoja aplikacja może zamiast tego używać tego programu.

http://java.net/jira/browse/JAVASERVERFACES-2103

EDIT:

można po prostu przekazać byte [] bezpośrednio jako argument do metody takiego.Możesz jednak przekazać identyfikator samochodu jako parametr, a następnie pobrać ten samochód i pobrać bajty z jednostki Car. Powodem tego jest fakt, że graphicImage faktycznie renderuje się jako znacznik HTML img i występuje w oddzielnym żądaniu HTTP od żądania strony JSF. Pobierz i zainstaluj wtyczkę Firebug dla przeglądarki Firefox, a zobaczysz, że tak się stało, strona jest żądana, a następnie pojawiają się kolejne żądania dotyczące obrazów po pobraniu strony. Z tego powodu nie można uzyskać dostępu do tych komponentów bean ViewScoped i RequestScoped w ten sposób, jednak parametr żądania może nadal zostać przekazany wraz z niezbędnymi informacjami potrzebnymi do pobrania bajtów samochodowych dla obrazu.

<p:graphicImage value="#{manage.bytesToStreamedContent}"> 
<f:param name="item_id" value="#{car.id}" /> 
</p:graphicImage> 

Teraz w swojej posiadanej nieruchomości na fasoli możesz uzyskać identyfikator samochodu, a po otrzymaniu identyfikatora samochodu powinieneś być w stanie uzyskać odpowiedni samochód.

public StreamedContent getBytesToStreamedContent() { 
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("item_id"); 
    //Now get the car with the id 
} 
+1

Więc jakie są moje opcje, aby przedstawić moją tablicę bajtów jako obraz na stronie jsf? – fareed

+2

@fareed Zobacz edycję powyżej. Myślę, że być może nieprawidłowo używasz grafiki. –

+1

Próbowałem tego, co sugerowałeś, ale uzyskałem taki sam wynik. Próbowałem także uzyskać obraz z przekazaniem określonego ciągu bezpośrednio z back-bean i otrzymuję to samo, jego renderowanie. Naprawdę utknąłem z tym – fareed

Powiązane problemy