¿Cómo puedo almacenar en una base de datos (en un campo blob o container) un archivo txt?

Anteriormente había guardado una imagen jpg dentro de una base de datos con ayuda de un PreparedStatement y usando PutAs(?, 'JPEG'). Intenté utilizar el mismo método cuando supe que necesitaba guardar un archivo con extensión txt y en la función de PutAs() lo único que cambie fue poner 'TXT' en vez de 'JPEG' pero nada... Me aparece que TXT no es un nombre válido para un stream.

Estoy abierta a otras opciones y a que me iluminen XD

1 respuesta

Respuesta
1

Bueno esta podría ser una solución a tu problema, a mi parecer algo genérico que podrías usar para subir a tu BD cualquier tipo de archivo en tu sistema de ficheros:

File aSelected = new File("/ruta/del/fichero/a/subir");

long length= aSelected.length();
InputStream is = new FileInputStream(aSelected);

byte[] data1 = new byte[(int)length];

int offset = 0;
int numRead = 0;
while (offset < data1.length
&& (numRead=is.read(data1, offset, data1.length-offset)) >= 0) {
offset += numRead;
}

if (offset < data1.length) {
throw new IOException("No se pudo completar la lectura del fichero "+aSelected.getName());
}

//En este punto asignas la variable data1 al campo serializable (el que mapea con blob) de tu objeto a persistir.

is.close();

:)

Hola!

Muchas gracias por tu respuesta tan pronta, he implementado lo que me comentas y si me guarda el archivo lo único es que me lo guarda siempre con el nombre Untitled.dat, me gustaría que se guarde con el nombre del archivo de mi ruta y que ademas su extensión sea .txt, existe alguna forma de hacer esto?

Gracias nuevamente por la ayuda. Saludos :)

NO entiendo mucho tu pregunta en este caso faltaría ver como tienes mapeado la
BD y como almacenas, pero en realidad cuando guardas el fichero como un objeto serializable
en la BD este se almacena como un array de Bytes así que no se almacena el
nombre del archivo, podrías a mi ver tener dos soluciones, una poner en el
objeto serializable delante también en bytes el
nombre del archivo, o poner un campo en la BD en la misma tabla que lo contenga
así cuando lo muestres o permitas descargarlo le pones ese nombre en un header,
algo como esto serian los dos casos:
1-
File aSelected = new
File("/ruta/del/fichero/a/subir");
//Inicio de cosas insertadas
String nameToPutInBD = aSelected.getName();
byte[] bName = nameToPutInBD.getBytes();
long nameLength =
bName.length;
byte[] text = (“”+nameLength).getBytes();
//Fin de cosas insertadas
long length=
aSelected.length();
InputStream is = new FileInputStream(aSelected);
byte[] data1 = new
byte[(int)length + (int) nameLength + text.length];//nuevo
//Inicio de cosas insertadas
for(int i = 0 ; i< text.length;i++){
data1 = text;
}
for(int i = 0,j= text.length ; i< nameLength;i++,j++){
data1 = bName;
}
//Fin de cosas insertadas
int offset = nameLength + text.length;//nuevo
int numRead = 0;
while (offset < data1.length
&& (numRead=is.read(data1, offset, data1.length-offset)) >= 0) {
offset += numRead;
}
if (offset < data1.length) {
throw new IOException("No se pudo completar la lectura del fichero
"+aSelected.getName());
}
//En este punto asignas la variable data1 al campo serializable (el que
mapea con blob) de tu objeto a persistir.
is.close();
2-
File aSelected = new
File("/ruta/del/fichero/a/subir");
//Inicio
de cosas insertadas
String nameToPutInBD = aSelected.getName();
//Fin
de cosas insertadas
long length= aSelected.length();
InputStream is = new FileInputStream(aSelected);
byte[] data1
= new byte[(int)length];
int offset
= 0;
int numRead
= 0;
while (offset
< data1.length
&& (numRead=is.read(data1, offset, data1.length-offset)) >= 0) {
offset += numRead;
}
if (offset < data1.length) {
throw new IOException("No se pudo completar la lectura del fichero
"+aSelected.getName());
}
//En este punto asignas la variable data1 al campo serializable (el
que mapea con blob) de tu objeto a persistir.
//ademas
asigna el valor del nombre de tu archivo a el campo correspondiente
is.close();
//Inicio
de cosas insertadas
//Aquí te va el header que debes pasar en el
momento de descargar el fichero al usuario, en el caso de mostrar el nombre
simplemente muestras el del campo que salvaste.
response.addHeader("Content-Disposition",modo + ";
filename="nombreDelFichero.extensión");
la variable modo puede
tomar dos valores [inline, attachment] para
que se intente abrir el fichero en el navegador o directamente se le solicite
la descarga al usuario.
//Fin de cosas insertadas

Nada de esto fue escrito en un IDE así que pueden haber algunos errores pero básicamente es esta la idea, en la primera opción debes recordar que para usar el archivo primero tienes que coger el primer entero que te dice el tamaño del nombre lo coge y lo comviertes y el resto es el fichero, igual te recomiendo la segunda opción, pero eso ya es tu elección.

o.o OOOhhh...!! muchas gracias por la explicación, aún no he probado el código pero lo he leído y creo que entendí tu idea, me parece una excelente solución, voy a intentar implementarla :) y yo creo que primero Dios eso los arregla todo ^-^ .

De veras gracias por el tiempo dedicado. Te mando un saludo afectuoso.

Disculpa la molestia pero debes evaluar la respuesta,

Claro, solo estaba probando el consejo que me diste para ver si no tenia alguna aclaración XD je je pero parece todo funcionar bien, cosa que me alegra muchisimo =D

Muchas gracias por tu tiempo y ayuda :) . Que tengas una bonita semana y Dios te bendiga.

Saludos ^-^

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas