2010-05-17 12 views
5

मेरे पास कुछ छवियों के साथ एक डेटाबेस है। क्या कोई मुझे बता सकता है कि मैं जेएसएफ पेज में एक छवि कैसे लोड कर सकता हूं?प्रबंधित बीन्स का उपयोग कर जेएसएफ पेज के अंदर डीबी से एक छवि कैसे लोड करूं?

मेरे पास पहले से ही एक प्रबंधित बीन है जो एक छवि ऑब्जेक्ट को स्ट्रीमकंटेंट में परिवर्तित करता है। इस स्ट्रीमकंट को पृष्ठ से <h:graphicImage> टैग में कहा जाता है, लेकिन जब मैं पृष्ठ के स्रोत कोड की जांच करता हूं, तो वहां src नहीं है जहां छवि लोड की जा सकती है।

उत्तर

12

जेएसएफ <h:graphicImage> एचटीएमएल <img> तत्व के रूप में प्रस्तुत किया जाता है। इसकी src विशेषता बाइनरी सामग्री के लिए नहीं, एक यूआरएल को इंगित करना चाहिए। तो आपको जेएसएफ बीन में यूआरएल (या कम से कम कुछ पहचानकर्ता अनुरोध पैरामीटर या पाथिनोफो) के रूप में स्टोर करना चाहिए और डीबी से HTTP प्रतिक्रिया में छवि स्ट्रीम करने के लिए एक अलग सर्वलेट बनाना चाहिए। अपने JSF पेज में

उपयोग करें:

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

यह मानते हुए कि bean.getImageId() रिटर्न 123, इस के रूप में HTML में प्रदान की गई हो:

<img src="images/123"> 

एक Servlet वर्ग है जो एक url-pattern पर web.xml में मैप किया गया है बनाएं /images/* और इसके doGet() विधि को निम्नानुसार लागू करें .:

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() में आप डेटाबेस से InputStream के रूप में छवि में ResultSet#getBinaryStream() का उपयोग कर सकते हैं।

this article में एक विस्तारित उदाहरण पाया जा सकता है।

+0

उपरोक्त कोड में संदर्भित छवि इकाई में 'ऊंचाई' और 'चौड़ाई' विशेषताएँ भी होनी चाहिए? – thejartender

+0

@thejartender: यह आपकी पसंद के लिए स्वतंत्र है :) हालांकि यह इस संदर्भ में केवल बेकार है। आवश्यक '' तत्वों को मुद्रित करते समय आप इसे दृश्य पक्ष (जेएसपी/फेसलेट/आदि) में उपयोग करेंगे। – BalusC

+0

किसी के लिए इस पर ठोकर खाई जाने के लिए: मैं छवि को लाने के लिए सादा आईडी का उपयोग न करने के महत्व पर जोर देना चाहूंगा जबतक कि आप अपने डेटाबेस से सभी छवियों को पुन: सक्रिय (और डाउनलोड) करना पूरी तरह से आसान नहीं चाहते हैं। इसके बजाय, बाल्डस पोस्ट किए गए लेख में सुझाए गए आईडी और फ़ाइल नाम के धोखेबाज संयोजन का उपयोग करें। – mabi

संबंधित मुद्दे