2012-03-01 23 views
11

Tôi đang sử dụng streamedcontent để render một byte được gửi từ JSF sau đó gửi nó trở lại như một nội dung xem trực tiếp như sau:graphicimage không render streamedcontent trong Primefaces

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

nơi hình ảnh đại diện mảng byte của hình ảnh được lưu trữ trong cơ sở dữ liệu

ủng hộ đậu:

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

Nhưng tôi không nhận được các hình ảnh trong trang JSF. Tôi nhận được thông báo này xuất hiện trong nhật ký máy chủ:

CẢNH BÁO: JSF1091: Không thể tìm thấy loại mime cho nội dung động tệp. Để giải quyết vấn đề này, thêm ánh xạ kiểu mime vào web.xml của ứng dụng.

và:

SEVERE: Error in streaming dynamic resource. 

bạn có thể vui lòng giúp tôi ra ở đây, tôi không thể tìm thấy bất kỳ thông tin hữu ích về vấn đề này

PS:

Im sử dụng các thư viện sau:

Mojarra 2.1.3

PrimeFaces 3.1.1

Glassfish 3.1

+0

thể trùng lặp của [Vấn đề hiển thị hình ảnh blob cơ sở dữ liệu trong Primefaces graphicimage] (http://stackoverflow.com/questions/10073905/problems-displaying-database-blob-image-in -primefaces-graphicimage) – BalusC

+0

Các câu hỏi liên quan/trùng lặp: http://stackoverflow.com/questions/8207325/display-image-from-database-with-pgraphicimage/, http://stackoverflow.com/questions/10073905/problems- display-database-blob-image-in-primefaces-graphicimage, http://stackoverflow.com/questions/10944673/how-to-use-pgraphicimage-with-defaultstreamedcontent-in-an-uirepeat/, http: // stackoverflow .com/questions/8304967/how-to-use-pgraphicimage-với-streamedcontent-within-pdatatable/ – BalusC

+1

@BalusC nhưng bài đăng này cũ hơn một số câu hỏi "có liên quan" mà bạn đã đề cập !!! – fareed

Trả lời

10

Tìm thấy vấn đề ở đâu. Vấn đề không phải trong đồ họa. Đó là vì thẻ đồ họa đang được tải động (vấn đề tương tự khi cố gắng tải từ dữ liệu có thể đặt). Hình ảnh động không thể được hiển thị trực tiếp trong datatable hoặc datagrid. (Giải pháp thay thế là chỉ định một tham số và đưa hình ảnh từ id).

Tuy nhiên, giải pháp là here

3

Nói chung, bạn không nên tạo StreamedContent trong bộ thu thập đồ họa. Hình ảnh sẽ được tìm nạp trong một yêu cầu riêng biệt từ phần còn lại của nội dung, có nghĩa là các biến phụ thuộc vào trình lặp sẽ không hoạt động. Điều này có nghĩa là trong lệnh gọi có liên quan đến bytesToStreamedContent, mảng byte sẽ rỗng/rỗng. Nếu bạn đặt các điểm ngắt bên trong phương thức, có thể bạn sẽ thấy rằng trong cuộc gọi cuối cùng không có dữ liệu nào theo byte.

Bạn cần đảm bảo hình ảnh được tạo trong khi vẫn có quyền truy cập vào tất cả nội dung cần thiết và sau đó lưu trữ nội dung theo cách bạn sẽ truy xuất lại trong byteToStreamedContent. Có hay không điều này sẽ khắc phục vấn đề và thực sự làm việc cho bạn là khó nói mà không nhìn thấy phần còn lại của mã. Tôi sẽ bắt đầu bằng cách cố gắng loại bỏ đối số mảng byte và trả về một hình ảnh tĩnh để xác nhận rằng đây là vấn đề.

+0

các byte đến từ cơ sở dữ liệu ở vị trí đầu tiên và được chuyển tới JSF. Sau đó, từ JSF im gửi yêu cầu hiển thị dưới dạng nội dung được truyền trực tuyến để xem hình ảnh. Tuy nhiên, tôi đã cố gắng để đọc các tập tin như là một inputstream từ applicationFiles ứng dụng và tạo ra một add to streamedContent nhưng nó vẫn không render. Cuối cùng, tôi đã cố gắng lấy tệp trực tiếp từ nguồn tĩnh như sau: và lần này nó được hiển thị thành công. Bạn nghĩ sao? – fareed

+0

nếu sử dụng một cái gì đó như InputStream là = new FileInputStream ("C: \ images \ lemontree.jpg"); không giúp được gì, tôi thực sự không biết có gì sai. Tôi chủ yếu chỉ quan tâm đến tham số car.image không hoạt động như bạn nghĩ. – MatsT

4

Đây là vấn đề kỳ lạ và tôi không nghĩ rằng việc thêm loại mime vào web.xml sẽ sửa lỗi đó. Nó được liệt kê như là cả một lỗi trong PrimeFaces với một mục tiêu cho 3,2

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

Và nó cũng được liệt kê như là một lỗi mở trong cá móm 2.1.1. Có một bản vá được gửi cho lỗi này tuy nhiên có vẻ như bạn sẽ phải áp dụng mã theo cách thủ công cho nguồn Mojarra 2.1.1 và xây dựng nó. Người ta sẽ nghĩ rằng điều này sẽ được cố định trong 2.1.3 tuy nhiên, Glassfish có thể có triển khai Mojarra được biên dịch sẵn của riêng nó mà vẫn còn ở phiên bản trình xử lý và ứng dụng của bạn có thể đang sử dụng nó thay thế.

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

EDIT:

Bạn chỉ có thể vượt qua các byte [] trực tiếp như một cuộc tranh cãi với phương pháp như thế.Những gì bạn có thể làm mặc dù là vượt qua id của chiếc xe như một param và sau đó lấy chiếc xe đó và lấy các byte từ thực thể xe. Lý do là vì graphicImage thực sự hiển thị dưới dạng thẻ HTML img và điều này xảy ra trong yêu cầu HTTP riêng biệt từ yêu cầu cho trang JSF. Tải xuống và cài đặt plugin Firebug cho Firefox và bạn sẽ thấy điều này xảy ra, trang được yêu cầu, sau đó yêu cầu tiếp theo xảy ra cho hình ảnh sau khi trang được truy xuất. Bởi vì các hạt ViewScoped và RequestScoped này không thể được truy cập theo cách này, tuy nhiên một tham số yêu cầu vẫn có thể được thông qua với các thông tin cần thiết cần thiết để truy xuất các byte Ô tô cho hình ảnh.

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

Bây giờ trong thuộc tính bean được quản lý của bạn, bạn có thể lấy id xe và sau khi bạn lấy id xe, bạn sẽ có thể nhận được chiếc xe phù hợp.

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

Vì vậy, các tùy chọn của tôi để trình bày mảng byte của tôi là hình ảnh trên trang jsf là gì? – fareed

+2

@fareed Xem chỉnh sửa cho câu trả lời của tôi ở trên. Tôi nghĩ rằng có lẽ bạn có thể sử dụng graphicImage không chính xác. –

+1

Tôi đã thử những gì bạn đã đề xuất ở đây nhưng tôi đã nhận được kết quả tương tự. Tôi cũng đã cố gắng để có được hình ảnh với đi qua một chuỗi được xác định trực tiếp từ đậu ủng hộ và Im nhận được cùng một điều, nó không rendering. Thực sự bị mắc kẹt với cái này – fareed