Cómo insertar ficheros de cualquier tipo en un campo de una tabla de MySQL, utilizando Delphi como lenguaje de programación. Os explicamos como añadir un fichero y cómo sacarlo/guardarlo una vez insertado en un campo de una tabla MySQL.

Preparar base de datos MySQL con tabla y campo longblob

Mostraremos, con un ejemplo, cómo hacer un mini gestor documental, una aplicación donde almacenar ficheros, con su descripción correspondiente, para poder tenerlos alojados en un lugar común, en una base de datos MySQL.

En primer lugar crearemos la tabla en MySQL, para ello podremos utilizar cualquier aplicación que permita acceder a MySQL y ejecutar consultas SQL de creación de tablas. En nuestro caso utilizaremos «AjpdSoft Administración Bases de Datos», disponible gratuitamente en esta web, este es el enlace de la descarga (es necesario ser usuario registrado):

Con esta aplicación o con cualquier otra que admita acceso a MySQL crearemos la tabla donde alojaremos los ficheros, la sentencia SQL para crear la tabla sería la siguiente:

CREATE TABLE documentos (
  codigo int(10) unsigned NOT NULL auto_increment,
  ficherodescripcion varchar(255) default NULL,
  ficherorutafisica varchar(255) default NULL,
  ficherocontenido longblob,
  fechaalta datetime default NULL,
  observacion text default NULL,
  PRIMARY KEY (codigo)
)

El campo donde se alojará el fichero será «ficherocontenido» de tipo longblob (admite hasta ficheros de 4 GB, aunque no recomendamos superar 100 MB si la base de datos va a ser accesible desde Internet) . A continuación os mostramos captura de pantalla de la aplicación en el proceso de creación de la tabla:

Preparar base de datos MySQL con tabla y campo longblob

Insertar ficheros en campo de tabla MySQL con Delphi 6

Tras crear la tabla abriremos Delphi para realizar la aplicación que gestione la tabla creada anteriormente. Desde Delphi, pulsaremos «File» – «New application». En nuestro caso, para el acceso a MySQL utilizaremos un componente gratuito para Delphi y MySQL llamado ZeosDBO, disponible en http://sourceforge.net/projects/zeoslib, en el siguiente enlace (de esta web) os explicamos cómo instalarlo paso a paso:

En nuestra aplicación de Delphi añadiremos los siguientes componentes al formulario principal:

  • ZConnection: componente para la conexión con el servidor de base de datos MySQL.
  • ZTable: componente para manipulación de tablas MySQL.
  • DataSource: componente que enlaza el ZTable con los cuadros de edición de los campos de la tabla MySQL.
  • DBNavitagor: componente visual con los botones típicos para manipular registros (editar, validar, eliminar, insertar, refrescar, siguiente, anterior, primero, último).

Os indicamos las propiedades que hay que cambiar en los diferentes componentes:

  • En la propiedad «DataSet» del componente «DataSource» pondremos el nombre del componente «ZTable», de esta forma quedarán enlazados.
  • En la propiedad «DataSource» del componente DBNavigator pondremos el nombre del componente «DataSource», de esta forma quedará enlazado el DBNavigator con el ZTable pues , éste a su vez, está enlazado con el DataSource.
  • En la propiedad «Connection» del componente «ZTable» pondremos el nombre del componente «ZConnection».

Para ver todas las propiedades y los componentes restantes (formulario, botones, savedialog, opendialog, etc), os recomendamos que descarguéis el código fuente de la aplicación, pulsando aquí.

El formulario de Delphi quedará de la siguiente forma:

Insertar ficheros en campo de tabla MySQL con Delphi 6

Para realizar la conexión con la base de datos MySQL utilizaremos el siguiente código:

procedure TformMenuPrincipal.FormCreate(Sender: TObject);
begin
  dbConexion.Disconnect;
  dbConexion.HostName := leCadINI('BD','Servidor','localhost');
  dbConexion.Port := strtoint(leCadINI('BD','Puerto','3306'));
  dbConexion.Catalog := leCadINI('BD','Catálogo','gestordocumental');
  dbConexion.Database := leCadINI('BD','Catálogo','gestordocumental');
  dbConexion.User := leCadINI('BD','Usuario','root');
  dbConexion.Password := leCadINI('BD','Contraseña','');
  dbConexion.Connect;
  tTabla.Active := true;
end;

Donde utilizamos la función «leeCadINI» para leer valore fichero ini, con el siguiente código:

//Lee una cadena de texto de un INI
function leCadINI (clave, cadena : string; defecto : string) : string;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := readString (clave, cadena, defecto);
  finally
    free;
  end;
end;




El procedimiento que utilizaremos para insertar un fichero al registro actual será:

procedure TformMenuPrincipal.bInsertarFicheroClick(Sender: TObject);
begin
  if not (tTabla.State in [dsedit, dsinsert]) then
    tTabla.Edit;
  if dlAbrir.Execute then
  begin
    tTablaficherocontenido.LoadFromFile(dlAbrir.FileName);
    tTablaficherorutafisica.AsString := dlAbrir.FileName;
  end;
end;

El procedimiento que utilizaremos para eliminar un fichero ya insertado será:

procedure TformMenuPrincipal.bEliminarFicheroClick(Sender: TObject);
begin
  if not (tTabla.State in [dsedit, dsinsert]) then
    tTabla.Edit;
  tTablaficherocontenido.Clear;
  tTablaficherorutafisica.AsString := '';
end;
El procedimiento que utilizaremos para descargar un fichero ya insertado en la base de datos será:
procedure TformMenuPrincipal.bDescargarFicheroClick(Sender: TObject);
begin
  if tTablaficherocontenido.AsString <> '' then
  begin
    dlGuardar.FileName := ExtractFileName(tTablaficherorutafisica.AsString);
    if dlGuardar.Execute then
      tTablaficherocontenido.SaveToFile(dlGuardar.FileName);
  end
  else
    MessageDlg('Este registro no tiene fichero asignado.', mtInformation, [mbok], 0);
end;

Ejecutando y probando el Gestor Documental

Antes de ejecutar la aplicación, nos aseguraremos de introducir los datos de conexión al servidor MySQL en el fichero gestorDocumental.ini:

Ejecutando y probando el Gestor Documental

Para abrir la aplicación, haremos doble click en el fichero gestorDocumental.exe. La aplicación en ejecución quedará de la siguiente forma:

Ejecutando y probando el Gestor Documental

Si pulsamos el botón «Añadir fichero» nos mostrará una ventana como esta:

Ejecutando y probando el Gestor Documental

Una vez insertado el fichero, guardaremos el registro pulsando en el botón «Validar». A partir de ahora podremos recuperarlo en cualquier momento situándonos en el registro correspondiente y pulsando en el botón «Descargar fichero». También podremos eliminarlo pulsando en «Eliminar fichero».

Nota: MySQL regula el tamaño máximo del fichero insertado por medio del parámetro: max_allowed_packet, no permitirá ficheros de mayor tamaño que el especificado en este parámetro. Se guarda en el fichero my.ini, en la carpeta de instalación del Servidor de MySQL, normalmente en:

C:/Archivos de programa/MySQL/MySQL Server 4.1

 Un ejemplo de contenido del fichero my.ini con el parámetro max_allowed_packet a 100MB:

Descargar el código fuente del ejemplo de Gestor Documental

Podéis descargar el código fuente completo del ejemplo, así como el script SQL para crear una tabla en el siguiente enlace: