2011-01-31 14 views
13

Para un applet en el que estoy trabajando Necesito convertir un archivo BufferedImage en una secuencia de entrada para poder subir la imagen a mi servidor MySQL. Al principio yo estaba usando este código:Java convirtiendo una imagen en una secuencia de entrada SIN crear un archivo

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

(mientras se pone las excepciones pertinentes) El código se cuelga en la parte en la que el applet intenta guardar la imagen en el ordenador. El código funcionaba perfectamente en Eclipse o cada vez que ejecutaba el applet desde el host local, así que supongo que el problema radica en los privilegios que tiene el applet para guardar archivos en la computadora del usuario.

Me preguntaba si había una manera de convertir el archivo de imagen en un flujo de entrada sin tener que guardar un archivo en la computadora del usuario. He intentado utilizar:

ImageIO.createImageInputStream(image); 

Pero entonces yo no podía convertir el ImageInputStream de nuevo a un InputStream. ¿Alguna sugerencia?

Gracias!

+2

argh! el mismo código que lee desde una base de datos hace el procesamiento de imágenes !! Eso es horrible. Por favor, lea: [Cohesion] (http://en.wikipedia.org/wiki/Cohesion_ (computer_science)), [Coupling] (http://en.wikipedia.org/wiki/Coupling_ (computer_science)) –

+0

Sí, es probable que no es la mejor práctica. Gracias por la información, tendré que arreglarlo más tarde. – David

+0

Posible duplicado de [Cómo convertir BufferedImage a InputStream?] (Http://stackoverflow.com/questions/4251383/how-to-convert-bufferedimage-to-inputstream) –

Respuesta

26

Normalmente se utilizaría un ByteArrayOutputStream para ese propósito. Actúa como una transmisión en memoria.

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

Impresionante pero una cosa más, necesito la longitud de la secuencia para crear BinaryStream, entonces ¿usaría os.toByteArray(). Length? – David

+3

¿Qué pasó cuando lo probaste? –

+0

funcionó perfectamente. Usé os.toByteArray(). Length y el código anterior. – David

1

¿Ha intentado escribir en ByteArrayOutputStream y luego crear un ByteArrayInputStream a partir de esos datos para leer? (Call toArray en el ByteArrayOutputStream y luego llamar al constructor de ByteArrayInputStream que envuelva a ese conjunto de bytes.)

+2

Gracias por la sugerencia, eso es básicamente lo que terminé pero la otra respuesta en realidad me alimentó con el código. : P – David

1

Tenga cuidado con las transmisiones BytArray: si la imagen es grande, ese código fallará. No he hecho mucha codificación de applet, pero es posible que el directorio temporal esté disponible para escritura (por ejemplo, File.createTempFile()).

+0

Hasta ahora ha funcionado, si no es así, entonces tendré que usar eso. Gracias – David

Cuestiones relacionadas