Foros del Web » Programación para mayores de 30 ;) » Java »

BLOB y jsp....

Estas en el tema de BLOB y jsp.... en el foro de Java en Foros del Web. Hola! Estaria muy agradecido que alguien me pudiera echar un cable :) Me ocurre que intento guardar una imagen en una base de datos oracle ...
  #1 (permalink)  
Antiguo 23/07/2007, 08:05
 
Fecha de Ingreso: noviembre-2006
Mensajes: 23
Antigüedad: 17 años, 5 meses
Puntos: 0
BLOB y jsp....

Hola! Estaria muy agradecido que alguien me pudiera echar un cable :)

Me ocurre que intento guardar una imagen en una base de datos oracle (campo de tipo BLOB) y me da un error raro:

java.sql.SQLException: El tamaño de los datos es mayor que el tamaño máximo para este tipo: 44051

Intento guardar el dato que contiene la imagen (que es un array de bytes) y me sale ese error, cuando otras veces he usado exactamente lo mismo para realizar esta tarea y nunca me habia dado problemas....

Bueno, Un saludo y gracias de antemano :)
  #2 (permalink)  
Antiguo 24/07/2007, 03:42
 
Fecha de Ingreso: noviembre-2006
Mensajes: 23
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: BLOB y jsp....

Bueno, viendo que el error no tiene aun exito entre el publico voy a dejar el mensaje de error completo que me da, a ver si asi es mas facil que alguien sepa de que puede ser el error :)


07/07/24 11:37:32 java.sql.SQLException: El tamaño de los datos es mayor que el tamaño máximo para este tipo: 172056
07/07/24 11:37:32 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBE rror.java:189)
07/07/24 11:37:32 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBE rror.java:231)
07/07/24 11:37:32 at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java :99)
07/07/24 11:37:32 at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindIte m(DBDataSetImpl.java:1772)
07/07/24 11:37:32 at oracle.jdbc.driver.OraclePreparedStatement.setItem (OraclePreparedStatement.java:991)
07/07/24 11:37:32 at oracle.jdbc.driver.OraclePreparedStatement.setByte s(OraclePreparedStatement.java:1966)
07/07/24 11:37:32 at org.apache.commons.dbcp.DelegatingPreparedStatemen t.setBytes(DelegatingPreparedStatement.java:134)
07/07/24 11:37:32 at actions.GestionEccmaAction.execute(GestionEccmaAct ion.java:278)
07/07/24 11:37:32 at org.apache.struts.action.RequestProcessor.processA ctionPerform(RequestProcessor.java:484)
07/07/24 11:37:32 at org.apache.struts.action.RequestProcessor.process( RequestProcessor.java:274)
07/07/24 11:37:32 at org.apache.struts.action.ActionServlet.process(Act ionServlet.java:1482)
07/07/24 11:37:32 at org.apache.struts.action.ActionServlet.doPost(Acti onServlet.java:525)
07/07/24 11:37:32 at javax.servlet.http.HttpServlet.service(HttpServlet .java:760)
07/07/24 11:37:32 at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
07/07/24 11:37:32 at com.evermind.server.http.ResourceFilterChain.doFil ter(ResourceFilterChain.java:65)
07/07/24 11:37:32 at oracle.security.jazn.oc4j.JAZNFilter.doFilter(Unkn own Source)
07/07/24 11:37:32 at com.evermind.server.http.ServletRequestDispatcher. invoke(ServletRequestDispatcher.java:604)
07/07/24 11:37:32 at com.evermind.server.http.ServletRequestDispatcher. forwardInternal(ServletRequestDispatcher.java:317)
07/07/24 11:37:32 at com.evermind.server.http.HttpRequestHandler.proces sRequest(HttpRequestHandler.java:790)
07/07/24 11:37:32 at com.evermind.server.http.HttpRequestHandler.run(Ht tpRequestHandler.java:270)
07/07/24 11:37:32 at com.evermind.server.http.HttpRequestHandler.run(Ht tpRequestHandler.java:112)
07/07/24 11:37:32 at com.evermind.util.ReleasableResourcePooledExecutor $MyWorker.run(ReleasableResourcePooledExecutor.jav a:192)
07/07/24 11:37:32 at java.lang.Thread.run(Thread.java:534)


el codigo que uso para insertar es el siguiente:

sql = "INSERT INTO TABLA (dato1, campo_blob) VALUES ( 'valor1',? )";

try {
stm = conexion.prepareStatement(sql);
byte[] arrayByte = new byte[(int)is.available()]; //la variable is es de tipo InputStream
try {
arrayByte = InputStreamToByte(is); //esta funcion pasa de InputStream a Byte
stm.setBytes(1,arrayByte);
stm.executeUpdate();
} ...
...
...


Saludos y muchas gracias! :)
  #3 (permalink)  
Antiguo 25/07/2007, 09:57
 
Fecha de Ingreso: noviembre-2006
Mensajes: 23
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: BLOB y jsp....

Bueno, ya consegui resolver el problema... se trataba un problema del driver de conexion con la base de datos... al hacer el setBytes() el array que se le introducia por parametro sobrepasaba el limite fijado por el driver para esa cadena de bytes.
Lo probe en el Tomcat y me iba perfectamente, por lo que deduzco que será de los drivers de los que tira el Jdeveloper.

Saludos y gracias al menos por leerme ;)
  #4 (permalink)  
Antiguo 30/12/2009, 14:06
 
Fecha de Ingreso: diciembre-2009
Mensajes: 1
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: BLOB y jsp....

Que tal! la respuesta es tarde, pero tuve el mismo problema apenas, y SI, la respuesta que diste es por el problema de los drivers, pero en lugar de cambiar todo, te muestro como se solucionó por aqui :D.

Vamos a dar por hecho que la variable "arch" contiene los bytes que vamos a meter a la base de datos. Y otra cosa, este ejemplo busca el archivo con el nombre, pero se puede cambiar para que busque el verdadero archivo por medio de un identificador.



java.sql.Connection cnn;
bytes arch[];
.
.
.

//Primero se inserta el blob vacio. esto es :
String sql= " INSERT INTO <MITABLA> (nombreArchivo, archivo) values (?,EMPTY_BLOB())";

PreparedStatement prstmt = cnn.prepareStatement(sql);
prstmt.setString(1,"ARHIVO1.jpg");
prstmt.executeUpdate();
if (prstmt!=null)
{ prstmt.close();
}

//Se hace un insert for update para que se tome el registro y se bloque
String sql2= "SELECT archivo FROM <MITABLA> WHERE nombreArchivo=? FOR UPDATE";

prstmt = cnn.prepareStatement(sql2);
prstmt.setString(1,"ARHIVO1.jpg");
RestultSet rs = prstmt.executeQuery();
rs.next();
oracle.sql.BLOB dbBlob = (oracle.sql.BLOB)rs.getBlob(1);
if (prstmt!=null)
{ prstmt.close();
}

//Se actualiza el blob para que se ingrese el archivo
String sql3 = "UPDATE <MITABLA> SET ARCHIVO = ? WHERE nombreArchivo =?";
prstmt = cnn.prepareStatement(sql3);
dbBlob.putBytes(1,arch);
prstmt.setBlob(1,dbBlob);
prstmt.setString(2,"ARHIVO1.jpg");
prstmt.execute();



Esto esta implementado en oracle 9i, espero que les funcione
Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:40.