Discussion:
Guardar fichero en Base de Datos
(demasiado antiguo para responder)
__-Joker-__
2006-03-17 09:53:17 UTC
Permalink
Hola a todo el grupo, este es mi primer mensaje en el foro. Estoy
empezando en esto del Java y tengo una duda, a ver si alguien podría
echarme una mano, un brazo o un pie...

El problema es el siguiente, necesito guardar en una base de datos
(estoy utilizando Oracle 9i) un archivo (.txt o .doc), no la ruta donde
se encuentra sino el archivo en sí todo ello desde java. ¿es posible?

Si alguien me pudiera guiar para orientarme y encaminarme o poner
algún link con información al respecto, le estaría muy agradecido.

Gracias de antemano.
EdUarDo
2006-03-17 10:06:03 UTC
Permalink
Post by __-Joker-__
Si alguien me pudiera guiar para orientarme y encaminarme o poner
algún link con información al respecto, le estaría muy agradecido.
Lo primero es que la columna en la BBDD debe ser de un tipo BLOB. Creo que hay
otros tipos (CLOB, RAW, etc... eso te lo dejo a tí :)).

Un ejemplo de como leer un BLOB:


try {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT col_blob FROM mysql_all_table");

if (rs.next()) {
// Get the BLOB from the result set
Blob blob = rs.getBlob("col_blob");

// Get the number bytes in the BLOB
long blobLength = blob.length();

// Get bytes from the BLOB in a byte array
int pos = 1; // position is 1-based
int len = 10;
byte[] bytes = blob.getBytes(pos, len);

// Get bytes from the BLOB using a stream
InputStream is = blob.getBinaryStream();
int b = is.read();
}
} catch (IOException e) {
} catch (SQLException e) {
}
__-Joker-__
2006-03-17 10:28:16 UTC
Permalink
Gracias por responder tan rápido, voy a meterle mano de inmediato al
código a ver que consigo.
De nuevo, muchas gracias. ;)
EdUarDo
2006-03-17 11:04:55 UTC
Permalink
Post by __-Joker-__
Gracias por responder tan rápido, voy a meterle mano de inmediato al
código a ver que consigo.
De nuevo, muchas gracias. ;)
Lo malo, creo recordar, es que no sé si el tratamiento de este tipo de campos es
distinto en Oracle que en MySQL, por ejemplo. Ahí ya te toca mirar un poco de
documentación.
Luis Miguel Cisneros
2006-03-17 21:11:34 UTC
Permalink
Post by EdUarDo
Post by __-Joker-__
Gracias por responder tan rápido, voy a meterle mano de inmediato al
código a ver que consigo.
De nuevo, muchas gracias. ;)
Lo malo, creo recordar, es que no sé si el tratamiento de este tipo de campos es
distinto en Oracle que en MySQL, por ejemplo. Ahí ya te toca mirar un poco de
documentación.
Hola
Para MySQL lo puedes hacer asi:

con = con = ds.getConnection(); //como obtengas la conexion
pstm = con
.prepareStatement("UPDATE producto SET imagen=?
WHERE id=?");
pstm.setBytes(1, imagen); /*la imagen es un vulgar arreglo
de bytes */
pstm.setLong(2, this.getId().longValue());

int result = pstm.executeUpdate();

y para leer:

con = con = ds.getConnection();
pstm = con
.prepareStatement("SELECT imagen FROM producto
WHERE id=?");
pstm.setLong(1, this.getId().longValue());

rs = pstm.executeQuery();
if (rs.next()) {
imagen = rs.getBytes("imagen"); /* imagen es, un
arreglo de bytes */
}

Salud!
--
Luis Miguel Cisneros León SCJP 1.4, SCBCD 1.3, SCJP 1.5, SCWCD 1.4.
http://www.mindars.com
EdUarDo
2006-03-21 15:33:47 UTC
Permalink
Hola
A mí me da lo mismo como hacerlo para MySQL, contéstale a él!! ;)
a***@gmail.com
2006-03-21 11:29:12 UTC
Permalink
Desgraciadamente el uso de los campos lob no es muy intuitivo, es
necesario insertar un registro con un lob vacío, para después
consultarlo en actualización y obtener un lob locator sobre el cual
podremos trabajar:


PreparedStatement pstmt_insert = con.prepareStatement(
"INSERT INTO TABLA_EJEMPLO (ID, CAMPO_CLOB) " +
"VALUES (" +
"'" + myObject.getID() + "', " +
"EMPTY_CLOB())");

pstmt_insert.executeUpdate();

// Objetemos el registro que hemos insertado
// para poder completarlo con el valor del campo lob.
PreparedStatement pstmt_select = con.prepareStatement(
"SELECT CAMPO_CLOB FROM TABLA_EJEMPLO "+
"WHERE ID = '" + myObject.getID() + "' " +
"FOR UPDATE");

ResultSet lobDetails = pstmt_select.executeQuery();

if( lobDetails.next() ) {
// Obtenemos el lob locator
Clob campoClob = lobDetails.getClob("CAMPO_CLOB");
campoClob.setString(1, myObject.getCampoCLOB());
}

con.commit();


En Oracle 10g es más sencillo:


// Create the OraclePreparedStatement object
opstmt = (OraclePreparedStatement)conn.prepareStatement(sql);

// Use the new method to insert the CLOB data (for data greater
or lesser than 32 KB)
opstmt.setStringForClob(1,str);

// Execute the OraclePreparedStatement
opstmt.executeUpdate();
EdUarDo
2006-03-21 15:35:01 UTC
Permalink
Post by a***@gmail.com
Desgraciadamente el uso de los campos lob no es muy intuitivo, es
necesario insertar un registro con un lob vacío, para después
consultarlo en actualización y obtener un lob locator sobre el cual
¡Exacto!, ya no me acordaba que se tenía que hacer eso!!

Loading...