2010-05-17 14 views
5

Bazı resimlerle veri tabanım var. Herkes bana bir JSF sayfasında nasıl resim yükleyebileceğimi açıklayabilir mi?Yönetilen çekirdekleri kullanarak bir JSF sayfasındaki bir resmi bir DB'den nasıl yüklerim?

Zaten bir streamcontent içine Resim nesneyi dönüştürür yönetilen bir fasulye var. Bu streamcontent, <h:graphicImage> etiketindeki sayfadan çağrılır, ancak sayfanın kaynak kodunu kontrol ettiğimde, resmin yüklenebileceği hiçbir src yoktur.

cevap

12

MTU <h:graphicImage> HTML <img> unsuru olarak işlenen olsun. Onun src özniteliği, ikili içeriğe değil, bir URL'ye işaret etmelidir. Bu nedenle, URL'yi (veya en az bir tanımlayıcı olarak istek parametresi veya pathinfo olarak) JSF fasulyesinde saklamanız ve görüntüyü DB'den HTTP yanıtına iletmek için ayrı bir sunucu uygulaması oluşturmalısınız. senin MTU sayfasında

bunu kullanın:

<h:graphicImage value="images/#{bean.imageId}"> 

bean.getImageId() döner 123, bu şekilde HTML olarak oluşturulmuş olsun varsayarsak:

<img src="images/123"> 

bir url-pattern üzerine web.xml eşlenmiş bir Servlet sınıf oluşturun şöyle .:

ve /images/* onun doGet() yöntemini uygulamak
Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123 (PS: don't forget to handle any exceptions). 
Image image = imageDAO.find(imageId); // Get Image from DB. 
// Image class is just a Javabean with the following properties: 
// private String filename; 
// private Long length; 
// private InputStream content; 

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename())); 
response.setHeader("Content-Length", image.getLength()); 
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\""); 

BufferedInputStream input = null; 
BufferedOutputStream output = null; 

try { 
    input = new BufferedInputStream(image.getContent()); 
    output = new BufferedOutputStream(response.getOutputStream()); 
    byte[] buffer = new byte[8192]; 
    int length; 
    while ((length = input.read(buffer)) > 0) { 
     output.write(buffer, 0, length); 
    } 
} finally { 
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} 
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {} 
} 

ImageDAO#find()'da, InputStream görüntüye veri tabanından ResultSet#getBinaryStream() kullanabilirsiniz.

uzatılmış örnek

this article bulunabilir.

+0

Yukarıdaki kodda atıfta bulunulan Görüntü Varlığı da 'yükseklik' ve 'genişlik' niteliklerini içermemelidir. – thejartender

+0

@thejartender: seçiminize ücretsizdir :) Ancak bu bağlamda sadece yararsızdır. Gerekli ' 'elemanlarını yazdırırken görünüm tarafında (JSP/Facelets/etc) kullanmayı tercih edersiniz. – BalusC

+0

Bu konuda tökezleyen herkes için: Ben veritabanını tüm görüntüleri yineleme (ve indirmek) tamamen kolay olmasını istemediğiniz sürece görüntü getirmek için düz kimliği kullanmamanın önemini vurgulamak istiyorum. Bunun yerine, yazılan BalusC makalesinde belirtildiği gibi kimlik ve dosya adının karma birleşimini kullanın. – mabi