2011-01-31 10 views
13

एक एप्लेट के लिए मैं काम कर रहा हूं मुझे BufferedImage फ़ाइल को इनपुट स्ट्रीम में कनवर्ट करने की आवश्यकता है ताकि मैं छवि को अपने MySQL सर्वर पर अपलोड कर सकूं। मूल रूप से मैं इस कोड का उपयोग किया गया था:जावा एक फ़ाइल को बनाने के बिना एक इनपुट स्ट्रीम में कनवर्ट करना

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection connection = 
    DriverManager.getConnection(connectionURL, "user", "pass"); 

psmnt = connection.prepareStatement(
    "insert into save_image(user, image) values(?,?)"); 
psmnt.setString(1, username); 

ImageIO.write(image, "png", new File("C://image.png")); 
File imageFile = new File("C://image.png"); 
FileInputStream fis = new FileInputStream(imageFile); 

psmnt.setBinaryStream(2, (InputStream)fis, (fis.length())); 
int s = psmnt.executeUpdate(); 

if(s > 0) { 
    System.out.println("done"); 
} 

(जबकि प्रासंगिक अपवादों को पकड़ने) कोड हिस्सा है जहाँ एप्लेट कंप्यूटर करने के लिए छवि को बचाने के लिए प्रयास करता है पर लटका हुआ है। कोड ग्रहण में पूरी तरह से काम करता है या जब भी मैं लोकलहोस्ट से एप्लेट चलाता हूं, तो मुझे लगता है कि समस्या विशेषाधिकारों में है कि एप्लेट उपयोगकर्ता के कंप्यूटर पर फ़ाइलों को सहेजने में है।

मैं बस सोच रहा था कि छवि फ़ाइल को उपयोगकर्ता के कंप्यूटर पर फ़ाइल सहेजने के बिना इनपुटस्ट्रीम में बदलने का कोई तरीका था या नहीं। मैं उपयोग करने की कोशिश:

ImageIO.createImageInputStream(image); 

लेकिन तब मैं ImageInputStream वापस एक InputStream में परिवर्तित नहीं कर सकता है। कोई सुझाव?

धन्यवाद!

+2

argh! डेटाबेस से पढ़ता है जो वही कोड छवि प्रसंस्करण करता है !! वह भयानक है। कृपया पढ़ें: [Cohesion] (http://en.wikipedia.org/wiki/Cohesion_ (computer_science)), [कपलिंग] (http://en.wikipedia.org/wiki/Coupling_ (computer_science)) –

+0

हाँ शायद यह है सबसे अच्छा अभ्यास नहीं है। जानकारी के लिए धन्यवाद, मुझे बाद में इसे ठीक करना होगा। – David

+0

संभावित डुप्लिकेट [BufferedImage को इनपुटस्ट्रीम में कैसे परिवर्तित करें?] (Http://stackoverflow.com/questions/4251383/how-to-convert-bufferedimage-to-inputstream) –

उत्तर

26

आमतौर पर आप उस उद्देश्य के लिए एक ByteArrayOutputStream का प्रयोग करेंगे। यह एक मेमोरी स्ट्रीम के रूप में कार्य करता है।

ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(image,"png", os); 
InputStream fis = new ByteArrayInputStream(os.toByteArray()); 
+0

बहुत बढ़िया लेकिन एक और बात, मुझे बाइनरीस्ट्रीम बनाने के लिए स्ट्रीम की लंबाई की आवश्यकता है, तो क्या मैं os.toByteArray() लंबाई का उपयोग करूंगा? – David

+3

जब आपने कोशिश की तो क्या हुआ? –

+0

यह पूरी तरह से काम किया। मैंने os.toByteArray() लंबाई और ऊपर कोड का उपयोग किया। – David

1

क्या आपने ByteArrayOutputStream पर लिखने की कोशिश की है और फिर उस डेटा से पढ़ने के लिए ByteArrayInputStream बना रहा है? (ByteArrayOutputStream पर toArray कॉल और फिर ByteArrayInputStream के निर्माता जो कि बाइट सरणी लपेट होगा कहते हैं।)

+2

सुझाव के लिए धन्यवाद, मूल रूप से जो मैंने समाप्त किया कर रहा है लेकिन दूसरे जवाब वास्तव में बच्चे ने मुझे कोड खिलाया। : पी – David

1

बाइटएरे स्ट्रीम का उपयोग करके सावधान रहें: यदि छवि बड़ी है, तो वह कोड विफल हो जाएगा। मैंने बहुत से एप्लेट कोडिंग नहीं किया है, लेकिन यह संभव है कि temp dir लेखन के लिए उपलब्ध है (उदा। File.createTempFile())।

+0

अभी तक यह काम करता है, अगर ऐसा नहीं होता है, तो मुझे इसका उपयोग करना होगा। धन्यवाद – David

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