2011-01-31 11 views
13

Per un'applet su cui sto lavorando Devo convertire un file BufferedImage in un flusso di input in modo che possa caricare l'immagine sul mio server MySQL. Originariamente stavo usando questo codice:Java conversione di un'immagine in un flusso di input SENZA creazione di un file

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"); 
} 

(mentre la cattura le eccezioni rilevanti) Il codice si blocca sul la parte in cui l'applet tenta di salvare l'immagine sul computer. Il codice funzionava perfettamente in Eclipse o ogni volta che eseguivo l'applet dal localhost, quindi presumo che il problema sia nei privilegi che l'applet ha nel salvare i file sul computer dell'utente.

Mi stavo solo chiedendo se ci fosse un modo per trasformare il file immagine in un inputstream senza dover salvare un file sul computer dell'utente. Ho provato ad utilizzare:

ImageIO.createImageInputStream(image); 

Ma poi non ho potuto convertire il ImageInputStream di nuovo ad un InputStream. Eventuali suggerimenti?

Grazie!

+2

argh! lo stesso codice che legge da un database esegue l'elaborazione delle immagini !! È raccapricciante. Per favore leggi: [Cohesion] (http://en.wikipedia.org/wiki/Cohesion_ (computer_science)), [Coupling] (http://en.wikipedia.org/wiki/Coupling_ (computer_science)) –

+0

Sì, probabilmente è non la migliore pratica. Grazie per le informazioni, dovrò ripararlo più tardi. – David

+0

Possibile duplicato di [Come convertire BufferedImage in InputStream?] (Http://stackoverflow.com/questions/4251383/how-to-convert-bufferedimage-to-inputstream) –

risposta

26

In genere si usa un ByteArrayOutputStream a tale scopo. Funziona come un flusso in memoria.

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

Impressionante ma una cosa in più, ho bisogno della lunghezza del flusso per creare il BinaryStream, quindi dovrei usare os.toByteArray(). Length? – David

+3

Cosa è successo quando l'hai provato? –

+0

ha funzionato perfettamente. Ho usato os.toByteArray(). Length e il codice sopra. – David

1

Hai provato a scrivere su un ByteArrayOutputStream e quindi a creare uno ByteArrayInputStream da quei dati da cui leggere? (Call toArray sulla ByteArrayOutputStream e poi chiamare il costruttore di ByteArrayInputStream che avvolgere che array di byte.)

+2

Grazie per il suggerimento, è fondamentalmente quello che ho finito facendo, ma l'altra risposta in realtà mi ha nutrito il codice. : P – David

1

Prestare attenzione all'utilizzo dei flussi BytArray: se l'immagine è di grandi dimensioni, il codice non funzionerà. Non ho fatto molta codifica di applet, ma è possibile che la dir temp sia disponibile per la scrittura (ad esempio File.createTempFile()).

+0

Finora ha funzionato, se non è così, allora dovrò usarlo. Grazie – David

Problemi correlati