Como guardar la ruta de un archivo en tabla MySQL y java

A veces en algun programa necesitamos guardar la ruta de un archivo. Por ejemplo si es un programa para llevar el control de empleados tal vez sera necesario guardar las fotografias de los empleados o una imagen de un producto, o la ruta de un archivo de documento, etc. Es por eso que se me ocurrio mostrar como se puede guardar la ruta de un archivo en una tabla de MySQL y recuperarla.

Parece facil, pero tiene su chiste, bueno para mostrar voi a diseñar una sencilla BD con una sola tabla que se llame productos con 3 unicos campos: el Id, el nombre del producto y su imagen (imagen muestra del producto). Los comandos SQL para crear la BD y la tabla son los siguientes:

CREATE DATABASE pruebaRuta;
USE pruebaRuta;
CREATE TABLE productos(id int auto_increment not null,nombre varchar(100), imagen varchar(2000), primary key(id) );

Observe que el id es auto_increment y por lo tanto el DBMS lo genera automaticamente, el campo imagen guarda una cadena que sera la ruta donde esta la imagen del producto.

Ahora imaginemos que las imagenes las tenemos almacenadas en la siguiente ruta del disco duro: c:\imagenes\productos. Podria pensarse que para realizar una insercion para registrar un nuevo producto en la tabla se haria con el comando:

INSERT INTO productos(nombre, imagen) VALUES('Chiles chipotles','c:\imagenes\productos\chipoles_100gr.jpg');

y de hecho si ese comando lo ejecutamos en la consola de MySQL nos dice que se inserto con exito:

 

insercion mal

insercion mal

bien, ahora hagamos un SELECT de la tabla para mostrar si se inserto…

 

select mal

select mal

…pero hooo! sorpresaa faltan las diagonales (slash). al parecer el DBMS las toma como secuencias de escape y las omite, no las guarda pues, desconozco sinceramente por que no guarda las diagonales pero e ideado una clase java que agrega doble diagonal o cualquier otro caracter para reemplazar los separadores de carpetas por unos que si son validos. La forma correcta de registrar un nuevo producto es esta:

INSERT INTO productos(nombre, imagen) VALUES('Chiles chipotles','c:\\imagenes\\productos\\chipoles_100gr.jpg');

ahora muestro como MySQL no manda error:

insert bien

insert bien

y ahora otra vez el SELECT y vemos como ahora si se guardo correctamente

 

select bien

select bien

aahh esta vez si se inserto bien la ruta del producto. Obviamente que las inserciones aqui hechas se han hecho desde la linea comandos del cliente de MySQL pero esta operaciones de INSERT se hacen mediante un programa java con una interfaz de usuario y esas cosas.
Para ilustrar todo esto con un ejemplo practico he creado 3 clases: JfrPrincipal.java, JfrAltaProductos.java, JfrVisorProductos.java, los cuales voi a ir explicando poco a poco a continuacion. No olvidar que el objetivo de este ejemplo es la de mostrar como mandar correctamente la ruta de un archivo a una tabla de MySQL y como recuperarla para mostrar el archivo (p. ej. imagenes, .txt) o abrirlo. A continuacion muestro el diagrama de clases del ejemplo:

Clases del ejemplo Corregir Ruta Archivo

Clases UML del ejemplo Corregir Ruta Archivo

Como se puede observar la clase que nos interesa la e resaltado en otro color, esta clase se instancia desde la clase JfrAltaProductos.java que es la que nos permite dar de alta a un nuevo producto, se llama desde aqui por que antes de dar de alta un producto (INSERT) se debe correguir la ruta.

JfrPrincipal.java
Este archivo es la clase principal y unicamente tiene la funcion de mostrar una GUI con dos botones para que el usuario elija abrir el visor de imagenes o agregue un nuevo producto. En el codigo hay algunos comentarios para describir brevemente que es lo que se hace:

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana principal del ejemplo, desde esta interfaz el usuario puede
					elegir entre ver las imagenes o dar de alta un nuevo producto.
Autor:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo JfrPrincipal.java
*/

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.*;

public class JfrPrincipal extends JFrame
{
	//Constructor
	JfrPrincipal(String titulo, int ancho, int alto)
	{
		//Establecer titulo, tamanio y posicion en la pantalla
		super(titulo);
		setSize(ancho,alto);
		setLocationRelativeTo(null);	//centrado
		//Rotulo principal de la ventana
		JLabel lblTitulo = new JLabel("Ventana principal");
		JPanel panTitulo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panTitulo.add(lblTitulo);
		//Crear el boton nuevo
		JButton btnNuevo = new JButton("Nuevo");
		JPanel panNuevo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panNuevo.add(btnNuevo);
		//Crear el boton para abrir el visor de imagenes
		JButton btnVisorImagenes = new JButton("Visor de imagenes");
		JPanel panVisor = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panVisor.add(btnVisorImagenes);
		
		//Todos los componentes estan en un Box Vertical
		//para alinear los controles
		Box boxVertical = Box.createVerticalBox();
		boxVertical.add(Box.createVerticalStrut(50));
		boxVertical.add(panTitulo);
		boxVertical.add(panNuevo);
		boxVertical.add(panVisor);
		//Agregar el Box a la ventana
		add(boxVertical);
		setResizable(false);	//No maximizar ni cambiar tamanio
		//Al dar en la X terminar todo el programa
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    	// ########### ESCUCHADOR BOTON NUEVO   ##########
    	ActionListener escuchadorAlta = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrAltaProductos ejemplo = new JfrAltaProductos("Alta de un nuevo producto",400,400);
            ejemplo.mostrar();
            //Ocultar la ventana principal
            setVisible(false);
        	}
   		};
    	btnNuevo.addActionListener(escuchadorAlta);

    	// ########### ESCUCHADOR PARA BOTON VISOR DE IMAGENES   ##########
    	ActionListener escuchadorVisor = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrVisorProductos ejemplo = new JfrVisorProductos("Visor de imagenes de productos",400,400);
            ejemplo.mostrar();
            //Ocultar la ventana principal
            setVisible(false);
        	}
   		};
    	btnVisorImagenes.addActionListener(escuchadorVisor);
    	
	}	//Fin del constructor

	//hace visible la ventana	
	public void mostrar()
	{
		setVisible(true);
	}

	public static void main(String[] args) 
   {
		JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
		ejemplo.mostrar();
   }
}

Ahora muestro imagen de la ventana que genera el codigo anterior:

Ventana principal del ejemplo.

Ventana principal del ejemplo.

Como se puede ver es una interfaz muy sencilla y es el punto de entrada del programa.

JfrAltaProductos.java
Esta clase permite dar de alta un nuevo producto, es decir permite hacer un INSERT en la tabla de productos con el nombre del producto y la ruta que corresponde a una imagen previa de dicho producto. En el codigo se muestra los comentario correspondientes explicando el codigo:

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana para dar de alta a un nuevo producto, antes de dar de alta
			un producto se debe corregir la ruta del archivo de imagen del producto.
Autor:  	Gonzalo Silverio   gonzasilve@gmail.com
Archivo: JfrAltaProductos.java
*/

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.Color;
import java.awt.event.*;
//Para usar la clase File con el FilesChooser
import java.io.*;
//Para usar operacion con BD (JDBC)
import java.sql.*;

public class JfrAltaProductos extends JFrame
{
	
	 //Script SQL para crear la tabla productos:
	 //CREATE TABLE productos(id int auto_increment not null,nombre varchar(100), imagen varchar(2000), primary key(id) );

   JTextArea jtaRutaImagen;
   JTextField jtfNombre;

	private static Connection con = null;
	Statement st;

	//Constructor
	JfrAltaProductos(String titulo, int ancho, int alto)
	{
		super(titulo);
		setSize(ancho,alto);
		setLocationRelativeTo(null);
		JLabel lblTitulo = new JLabel("Datos del producto");
		JPanel panTitulo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panTitulo.add(lblTitulo);
		
		//Crear una etiqueta y su campo de texto correspondiente para capturar el
		//nombre del producto
		JLabel lblNombre = new JLabel("Nombre: ");
		jtfNombre = new JTextField(20);
		JPanel panNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
      panNombre.add(Box.createHorizontalStrut(15));
		panNombre.add(lblNombre);
		panNombre.add(jtfNombre);
		//Crear el boton examinar
		JButton btnExaminar = new JButton("Examinar...");
      btnExaminar.addActionListener(new seleccionarImagen());
		
		//Crear el area de texto para mostrar la ruta absoluta del archivo
      JPanel panRutaImagen = new JPanel(new FlowLayout(FlowLayout.LEFT));
         jtaRutaImagen = new JTextArea(4,20);
         jtaRutaImagen.setDisabledTextColor(Color.BLUE);
         jtaRutaImagen.setLineWrap(true);
         jtaRutaImagen.setEnabled(false);
         JScrollPane scrollRutaImagen = new JScrollPane(jtaRutaImagen);
         scrollRutaImagen.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         scrollRutaImagen.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
      panRutaImagen.add(Box.createHorizontalStrut(15));
      panRutaImagen.add(scrollRutaImagen);
      panRutaImagen.add(btnExaminar);
		//Crear el boton Guardar
		JButton btnGuardar = new JButton("Guardar");
		JPanel panGuardar = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panGuardar.add(btnGuardar);
		//Crear el boton Cancelar
		JButton btnCancelar = new JButton("Cancelar");
		JPanel panCancelar = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panCancelar.add(btnCancelar);
		//Alinear los botones Guardar y Cancelar en forma horizontal
      Box boxGuardarCancelar = Box.createHorizontalBox();
      boxGuardarCancelar.add(btnGuardar);
      boxGuardarCancelar.add(Box.createHorizontalStrut(30));
      boxGuardarCancelar.add(btnCancelar);

		//Agregar todos los controles de usuario al Box Horizontal principal
		Box boxVertical = Box.createVerticalBox();
		boxVertical.add(Box.createVerticalStrut(50));
		boxVertical.add(panTitulo);
      boxVertical.add(Box.createVerticalStrut(50));
      boxVertical.add(panNombre);
      JPanel panEtiquetaRuta = new JPanel(new FlowLayout(FlowLayout.LEFT));
      panEtiquetaRuta.add(Box.createHorizontalStrut(15));
      panEtiquetaRuta.add(new JLabel("Imagen previa del producto"));
      boxVertical.add(panEtiquetaRuta);      
		boxVertical.add(panRutaImagen);
      boxVertical.add(Box.createVerticalStrut(10));
      boxVertical.add(boxGuardarCancelar);
      boxVertical.add(Box.createVerticalStrut(100));
		//Agregar el Box principal a este JFrame
		add(boxVertical);
		//No permitir maximizar ni redimensionar este JFrame
		setResizable(false);

// ##################### ESCUCHADOR DE VENTANA #############################################
    	//Para que al dar clic en la x de la esquina de este JFrame
      //se muestre por default la ventana principal
		this.addWindowListener(new WindowAdapter() 
		{
			public void windowClosing(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();

				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
				setVisible(false);
			}
		});

    	// ########### ESCUCHADOR BOTON CANCELAR   ##########
    	ActionListener escuchadorCancelar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
            setVisible(false);
        	}
   	};
    	btnCancelar.addActionListener(escuchadorCancelar);

    	// ########### ESCUCHADOR BOTON GUARDAR   ##########
    	ActionListener escuchadorGuardar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
        		//Validar que NO haya campos vacios
            if(hayCamposVacios())
            {
            	JOptionPane.showMessageDialog(null,"Debes escribir el nombre y elegir la ruta de la imagen, hay campos vacios");
            	return;
            }

            if( conectarBaseDatos() )
            {
               if( altaProducto() )
               {
               	JOptionPane.showMessageDialog(null,"Producto guardado con exito");
               	jtfNombre.setText("");
               	jtaRutaImagen.setText("");
               }                  
               else
                  JOptionPane.showMessageDialog(null,"No se pudo guardar");
            }
            else
               JOptionPane.showMessageDialog(null,"No se pudo Conectar la BD");

        	}
   	};
    	btnGuardar.addActionListener(escuchadorGuardar);
    	
	}  	//Fin del costructor

	//Conecta la base de datos y se prepara para un sentencia SQL
	//Devuelve true solo si la conexion tuvo exito
   public boolean conectarBaseDatos()
   {
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         String strCadenaConexion = "jdbc:mysql://localhost/pruebaRuta";
         con = DriverManager.getConnection(strCadenaConexion,"root","12345");
         if (con == null )
            return false;
         
         //Preparar conexion para ejecutar una sentencia SQL
         st = con.createStatement();
         return true;
      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }

	//Realiza un ALTA en la tabla de productos
   //devuelve true solo si se pudo realizar con exito el INSERT en la tabla
   public boolean altaProducto()
   {
      try
      {
         String strRutaImagen;
         //Instanciamos la clase que corrige la ruta del archivo
         CorregirRuta ruta1 = new CorregirRuta(jtaRutaImagen.getText(),"\\", "\\\\");
         //CORREGIR LA RUTA
         strRutaImagen = ruta1.obtenerRutaCorregidaWindows();
         //Hacer el insert con la ruta corregida
         int res = st.executeUpdate("INSERT INTO productos(nombre,imagen) VALUES('"+jtfNombre.getText()+"','"+strRutaImagen+"')");
         
         if(res==1)
            return true;
         else
            return false;

      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }

   //Comprueba true si alguno de los 2 campos esta vacios
   public boolean hayCamposVacios()
   {
      if( jtfNombre.getText().isEmpty() || jtaRutaImagen.getText().isEmpty() )
         return true;
      return false;
   }

   //hace visible la ventana
	public void mostrar()
	{
		setVisible(true);
	}

	//Clase interna
	class seleccionarImagen implements ActionListener
	{
	  public void actionPerformed(ActionEvent ae)
	  {
	   String strSeleccionado;
	   JFileChooser jfcSeleccionarArchivo = new JFileChooser();
	   //Asignar el filtro para que solo se vean imagenes en la ventana abrir
	   jfcSeleccionarArchivo.addChoosableFileFilter(new FiltroImagenes());
	   //Filtro a usarse por defecto
	   jfcSeleccionarArchivo.setFileFilter(jfcSeleccionarArchivo.getChoosableFileFilters()[1]);
	
	      // Abre el cuadro de dialogo Abrir
	      int retval = jfcSeleccionarArchivo.showOpenDialog(JfrAltaProductos.this);
	      if (retval == JFileChooser.APPROVE_OPTION)
	      {
	          //... Si el usuario selecciono un archivo, entonces usarlo
	          File filSeleccionado = jfcSeleccionarArchivo.getSelectedFile();
	          //Obtener ruta absoluta del archivo seleccionado
	          strSeleccionado = filSeleccionado.getAbsolutePath();
	          //Mostrar la ruta al usuario en el area de texto correspondiente
	          jtaRutaImagen.setText(strSeleccionado);
	      }
	  }
	}		//fin de clase interna


}		//Fin de la clase

A continuacion muestro una imagen de la ventana que se genera:

Ventana para dar de Alta un producto.

Ventana para dar de Alta un producto.


Dejando campos vacios…
Mensaje de error al dejar Campos vacios en alta de producto.

Mensaje de error al dejar Campos vacios en alta de producto.

Como se observa e insertado un producto de ejemplo para ilustrar como funciona la ventana. El usuario una vez que escribe el nombre y elije un archivo de imagen (con el Boton Examinar…) debe dar clic en el Boton Guardar; al hacer esto el programa realiza una pequeña validacion de campos vacios y si se logra satisfacer se hace el INSERT. Una vez que se realizo el INSERT el programa limpia los campos para que el usuario siga dando de alta mas productos. Si el usuario ya termino debe dar click en el Boton Cancelar para volver a la ventana principal del ejemplo.

Como se puede observar en el metodo altaProducto() se instancia a la clase CorregirRuta.java (pasandole la ruta sin corregir) y se ejecuta su metodo obtenerRutaCorregidaWindows() para obtener la ruta corregida, tambien en la clase interna seleccionarImagen se hace una instancia de la clase FiltroImagenes.java, a continuacion muestro el codigo de dichas clases:

CorregirRuta.java
Permite corregir al ruta de carpetas de un archivo para poder almacenarla correctamente en una tabla de MySQL. Creo que no necesita mucha explicacion pues en el cabezado del archivo se describe, sin tanto rodeo, el codigo es…

/*
 *		Instituto Tecnologico de Zacatepec, Mor.
 * Descripcion:
 *	Clase que eecibe una ruta de archivo y una cadena que es con la que vienen separadas los nombres de las carpetas
 *  y otra cadena mas que es el nuevo separador con el que se van a separar ahora las carpetas.
 *  Devuelve la ruta ya corregida con el nuevo separador
 * @author: Gonzalo Silverio gonzasilve@gmail.com
 * Archivo: CorregirRuta.java
 * 
 */
import java.util.StringTokenizer;

public class CorregirRuta 
{
    String ruta, separador, nuevoSeparador;	

    public CorregirRuta(String laruta, String sep, String nuevoSep)
    {
    	ruta=laruta;
    	separador=sep;
    	nuevoSeparador=nuevoSep;
    }

    public String obtenerRutaCorregidaWindows()
    {
         StringTokenizer tokens=new StringTokenizer(ruta, separador);
         //Para guardar la ruta corregida
         String rutaCorregida = new String();
         //Contar los tokens (en este caso las carpetas, contado tambien
         // el nombre del archivo seleccionado).
         int noTokens = tokens.countTokens();
         int i = 1;
         do
         {		//Agregar el nuevo separador
            rutaCorregida += tokens.nextToken()+nuevoSeparador;
            i++;
         }while(i<noTokens);
         //Agregar a la ruta corregida el ultimo token, (nombre del archivo)
         rutaCorregida += tokens.nextToken();		
         //Mostrar la ruta corregida en la consola
         System.out.println(rutaCorregida+"\n"+noTokens+ " tokens");
         return rutaCorregida;
    }
}

FiltroImagenes.java
Clase para filtrar unicamente los archivos de imagenes con extension .jpeg , .jpg , .png , .gif en la ventana de dialogo estandar Abrir.

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:
   Clase que permite mostrar unicamente los ficheros .jpeg,  .jpg,  .gif en los cuadros de dialogo.
   Un filtro es un objeto de la clase FileFilter del paquete javax.swing.filechooser.. FileFilter es una
   clase obstracta con dos metodos abstractos accept y getDescription.
Author:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo FiltroImagenes.java
*/

import javax.swing.filechooser.FileFilter;
import java.io.File;

public class FiltroImagenes extends FileFilter
{
    public boolean accept(File f)
   {
      if( f.isDirectory() )      
         return true;
      
      String nombreArchivo = f.getName().toLowerCase();
      if( nombreArchivo != null )
         if( nombreArchivo.endsWith(".jpeg") ||
            nombreArchivo.endsWith(".jpg")  ||
			nombreArchivo.endsWith(".png")  ||
            nombreArchivo.endsWith(".gif")
           )
            return true;
      
      return false;    
   }
   
   //Descripcion del filtro (se mostrara en la ventana abrir)
   public String getDescription()
   {
      return "Archivos de imagenes ( *.jpg ,  *.png ,  *.gif )";
   }
}        //Fin de la clase

JfrVisorProductos.java
Esta clase crea una ventana muy sencilla para mostrar los datos del producto, principalmente permite leer la ruta almacenada del archivo de imagen muestra del producto. En el codigo he comentado las partes mas importantes…

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana para mostrar las imagenes de los productos.
Autor:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo: JfrVisorProductos.java
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.sql.*;

public class JfrVisorProductos extends JFrame
{
   JPanel panelPrincipal, panelSuperior,panelInferior;

	private static Connection con = null;
	Statement st;
	ResultSet rs;
	
	int idsProductos[];    //Contiene los ID de los productos
	//Apunta al registro que se esta mostrando actualmente
	//Po defecto apuntar antes del primero
	int regActual = -1;
	int totalRegistros = 0;         //Contiene el total de registros que hay en la tabla
   JLabel lblNombreProducto = new JLabel("Nombre imagen");
   JPanel panImagen;
   JLabel lblImagen;
	Icon imagenn;
   
	JButton btnAnterior = new JButton("Anterior");
	JButton btnSiguiente  = new JButton("Siguiente");;
      
	Box boxpanSuperior;

   JfrVisorProductos(String tituloVentana, int ancho, int alto)
   {
      //Establecer titulo,tamanio, si es redimensionable y la posicion
      // de la ventana
      setTitle(tituloVentana);
      setSize(ancho,alto);
      this.setResizable(false);
      setLocationRelativeTo(null);
      
      JPanel panNombreProducto = new JPanel(new FlowLayout(FlowLayout.CENTER));
      panNombreProducto.add(lblNombreProducto);
      
      panelPrincipal = new JPanel(new BorderLayout());
      panelSuperior = new JPanel(new BorderLayout());
      panelInferior = new JPanel(new BorderLayout());
      btnAnterior.setMnemonic(KeyEvent.VK_A);
      btnSiguiente.setMnemonic(KeyEvent.VK_S);
      imagenn = new ImageIcon();
      lblImagen = new JLabel(imagenn);

      panImagen = new JPanel(new FlowLayout(FlowLayout.CENTER));
      panImagen.add(new JScrollPane(lblImagen), BorderLayout.CENTER);
      
      panelSuperior.add(panImagen);
      boxpanSuperior = Box.createVerticalBox();      
      boxpanSuperior.add(panNombreProducto);
      boxpanSuperior.add(panelSuperior);
      
      panelInferior.add(btnAnterior, BorderLayout.WEST);
      panelInferior.add(btnSiguiente, BorderLayout.EAST);
      panelPrincipal.add(boxpanSuperior, BorderLayout.CENTER);
      panelPrincipal.add(panelInferior, BorderLayout.SOUTH);

      add(panelPrincipal);
      inicializar();		//Cargar los IDs
      siguiente();		//Moverse al primer registro (estabamos uno antes del primero)
      
// ##################### ESCUCHADOR DE VENTANA #############################################
    	//Para que al dar clic en la x de la esquina de este JFrame
      //se muestre por default la ventana principal
	this.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();

				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
				setVisible(false);
			}
		});

    	// ########### ESCUCHADOR BOTON ANTERIOR   ##########
    	ActionListener escuchadorAnterior = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				anterior();				//Va al anterior registro de la tabla
        	}
   		};
    	btnAnterior.addActionListener(escuchadorAnterior);

    	// ########### ESCUCHADOR BOTON SIGUIENTE   ##########
    	ActionListener escuchadorSiguiente = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				siguiente();				//Va al siguiente registro de la tabla
        	}
   		};
    	btnSiguiente.addActionListener(escuchadorSiguiente);
    	
   }		//Fin del constructor

    //Inicializa el arreglo de IDs para que se puedan recorrer los registros 
    //y actualiza la variable que contiene el total de registros que hay en la tabla
    public void inicializar()
    {
        try
        {
            conectarBaseDatos();		//Nos conectamos con la BD
            rs = st.executeQuery("SELECT * FROM productos"); //seleccionamos todos los de la tabla productos

            //A continuacion se van a guardar en un arreglo los IDs de todos los productos
            if(! rs.first() )             //Nos movemos al primer registro
            	JOptionPane.showMessageDialog(null,"La tabla de productos esta vacia.");
	
            int contador = 0 ;
            do
                contador ++ ;           //Contar cuantos registros hay en la tabla productos
            while(rs.next());
            totalRegistros = contador-1;      //Guarda el numero de registros que hay en la tabla

            idsProductos = new int[contador];            //Crea el arreglo de IDs
            contador = 0;       //Reinicializar el contador
            rs.first();             //Nos movemos al primer registro
            do
                idsProductos[contador++]= rs.getInt("id");
            while(rs.next());

        }
        catch( SQLException sqlex  )
        {
            JOptionPane.showMessageDialog(null,"Error al inicializar el arreglo de IDs");
        }

    }		//Fin del metodo
    
    //permite desplazarse al anterior registro de la tabla
    public void anterior()
    {       
        regActual = regActual - 1;
        if ( regActual < 0 )
            regActual = 0;

        if(!consultarID())
            JOptionPane.showMessageDialog(null,"Error al ir al registro Anterior");
    }
	
	//permite desplazarse al siguiente registro de la tabla
    public void siguiente()
    {
        regActual = regActual + 1;
        if ( regActual > totalRegistros )
            regActual = totalRegistros;

        if(!consultarID())
            JOptionPane.showMessageDialog(null,"Error al ir al siguiente registro");
    }

    
    //Realiza una consulta con el ID seleccionado en regActual en el arreglo idsProductos[], 
    //devuelve true si se realizo la consulta con exito, en caso contrario devuelve false
    private boolean consultarID()
    {
        try
        {
            rs = st.executeQuery("SELECT * FROM productos where id="+idsProductos[regActual] ); //seleccionamos todos los de la tabla productos
            rs.first();                 //moverse al primer registro
            poblarCampos();
            return true;                //Todo se ejecuto con exito
        }
        catch(SQLException sqlex)
        {
            return false;
        }
    }		//Fin del metodo
    
    //rellena los campos con los datos del registro apuntado actualmente
    private void poblarCampos()
    {
        try
        {            
            lblNombreProducto.setText(rs.getString("nombre"));
            panImagen.remove(lblImagen);	//Borrar la imagen anterior
            //Recuperar de la BD la ruta del archivo de imagen
            imagenn = new ImageIcon(rs.getString("imagen"));	
            lblImagen = new JLabel(imagenn); //Cargar nueva imagen
            panImagen.add(lblImagen);	
            validate();
            repaint();	
				//Mostrar en la barra de titulo el reg. actual y el total
				setTitle("Visor de imagenes [producto "+(regActual+1)+" de "+(totalRegistros+1)+"]");

        }
        catch( SQLException sqlex  )
        {
            JOptionPane.showMessageDialog(null,"Error al rellenar los campos");
        }        
    }		//Fin del metodo
    

	//Conecta la base de datos y se prepara para un sentencia SQL
	//Devuelve true solo si la conexion tuvo exito
   public boolean conectarBaseDatos()
   {
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         String strCadenaConexion = "jdbc:mysql://localhost/pruebaRuta";
         con = DriverManager.getConnection(strCadenaConexion,"root","12345");
         if (con == null )
            return false;
         
         st = con.createStatement();
         return true;
      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }		//Fin del metodo
   
	//hacer visible la ventana
	public void mostrar()
	{
		setVisible(true);
	}

}	//Fin de la clase

El aspecto de la ventana que se genera es esta:

Visor de imagenes de productos

Visor de imagenes de productos



Como se puede observar en el codigo e ideado una manera de recorrrer los registros de la tabla con dos botones, me parece interesante esto; lo mas probable es que en otra entrada del blog publique algo al respecto pero ya con los 4 botones de navegacion de registros (Primero,Anterior,Siguiente,Ultimo).

Nota: La marca Sabritas, Rufles y Coca-Cola son marcas registradas y solo las e puesto aqui con propositos educativos, si el autor(es) desea que la retire basta con pedirlo.

Bueno esto creo que se alargo demasiado, el objetivo era corregir la ruta y meti varias cosas mas, jajaja pero estoy seguro que aprendi mas y espero que tu tambien. Si estas leyendo esto es por que me imagino que leiste todo lo anterior. Ya sabes si tienes dudas puedes dejar un comentario, o si quieres los .java basta con dejar tu mail… hasta pronto y gracias por pasar por aqui ;).

About these ads

Acerca de gonzasilve
Freelance Web Developer.

57 Responses to Como guardar la ruta de un archivo en tabla MySQL y java

  1. Fernando Robles dice:

    Supongo que muchos, lo que quieres es almacenar una ruta de archivo en un campo mysql, y bueno yo lo resolvi, haciendo una funcion static. y bueno funciona a la perfeccion, cabe aclarar, que realizar la consulta concatenando no es aconsejable se recomienda ocupen parametros, pero si aun insisten en concatenar esta es una solucion

    public static string RutasMysql(string cadena) //ruta que se obtiene por
    { //ejemplo de un caja de dialogo
    string cadena2 = “”; //inicializamos la cadena
    CharEnumerator enumerator = cadena.GetEnumerator();
    while (enumerator.MoveNext()) // lo que hace es saltar de un caracter a otro
    {
    char letra = (char) enumerator.Current;
    if (letra == ‘\\’)
    {
    cadena2 += ‘\\’;
    }
    cadena2 += letra;
    }
    return cadena2;
    }

    • gonzasilve dice:

      Fer muchas gracias por el aporte,

      Saludos!

  2. William Campos dice:

    Oye, ¿me podrías enviar los .java?, me han ayudado mucho, pues me daba el mismo problema, y me gustaría tenerlos para analizarlos bien y ver si loes puedo modificar para que agregue campos de datos. Mil Gracias

    • gonzasilve dice:

      Amigop ya puedes revisar tu inbox pues te lo acabo de mandar.

      Saludos.

  3. ivan dice:

    buen aporte oye me gustaria que me mandaras el codigo porfavor para poder modificarlo para hacer uno que guarde imagenes y datos gracias

    • gonzasilve dice:

      Ok te lo mande adjunto

      Saludos!

  4. kelvin dice:

    porfa…. necesito el dodigo este es mi correo cancer565vf@hotmail.com

    • gonzasilve dice:

      ok, te lo mande.

      Saludos

      • VICTOR HUGO CAMPOVERDE GONZALEZ dice:

        victorhug_25@hotmail.com si no fuera mucha molestia ami tambien

  5. Janner dice:

    Hola Gonzalo gracias por compartir tus conocimientos, agradeceria me enviaras los archivos a mi correo y me ayudaras con lo siguiente.

    Que pasa si son varias imagenes las que se necesitan para un mismo producto (imagen1, imagen2, imagen3, etc..), y dichas imagenes se necesiten redimencionar?

    Agradezco mucho tu pronta respuesta.

    • gonzasilve dice:

      ..Te acabo de mandar el codigo adjunto y para lo de varias imagenes para un mismo producto se me ocurre que debes crear una tabla para asociarlas imagenes a un producto
      algo asi:
      id id_producto st_imagen
      1 2 c:\imagenes\jabon220gr.jpg
      2 2 c:\imagenes\jabon450gr.jpg
      3 2 c:\imagenes\jabon1kg.jpg
      4 8 c:\imagenes\manzanita375ml.jpg
      5 8 c:\imagenes\manzanita500ml

      Para redimensionarlas lo puedes hacer guardando cada imagen con varias versiones (tamaños).

      Saludos!

  6. Maria dice:

    Hola me puedes enviar el codigo a mi correo por favor gracias

    • gonzasilve dice:

      Ok, Mary te lo acabo de enviar. Saludos cordiales

  7. Casandra dice:

    Hola Gonzalo, ya hace mucho de tu publicación, pero no puedo irme sin dejar un comentario de agradecimiento, hace mucho que batallaba con las imágenes y archivos en bases de datos y sobre todo con java, pero casualmente me topé con tu código que funcionó a la perfección y que está perfectamente explicado, mis más profundas felicitaciones por este post.

    • gonzasilve dice:

      Muchas gracias por tu comentario Casandra, pues me motivas a seguir escribiendo. Gracias a ti también, por tu visita. Saludos.

  8. oalbinob dice:

    disculpa como le hago para que en lugar de que me visualiza cada una de las imagenes que e guardado, me muestre alguna en especifico, por decir al poner en un jtextfield el nombre de rufles, me muestre la imagen de rufles usando tu ejemplo

    • gonzasilve dice:

      Podrias hacer una consulta por el nombre.SELECT * FROM productos where nombre=’rufles’ y en vez de escribir el nombre en el codigo pues tomar el valor de un jTextField con el metodo getText().

      • oalbinob dice:

        esta correcto, utilice parte de tu codigo para guardar la ruta de la imagen en mysql (te agradezco), la sentencia para visualizar una imagen especifica y a la tengo, ahora solo quisiera que me ayudaras a visualizar mi imagen: la idea es que tengo un jtextfiel y un boton, en el jtexfield ingresare el nombre de la imagen y al presionar el boton me muestre la imagen en el formulario java y ademas que me la abra en el visor de imagenes de windows, quisiera que me ayudaras, ya que no soy tan bueno y aunque ya e analizado tu codigo no encuentro la manera de como mandar mi imagen al formulario. ayudame porfa

  9. omar albino dice:

    disculpa gonzasilve, es justo lo que buscaba, solo que por ejemplo como le hago para que al mostrarme una imagen de algun producto, lo haga especificamente, es decir que yo quiera que me muestre la imagen del producto rufles, siguiendo tu ejemplo…

  10. Elizabeth dice:

    Buenas tardes, oye una duda, si yo quiero hacer esto con Android que de igual forma se maneja con java , sabrías como, entiendo el código que haces pues java pura, pero te agradezco si me puedes sacar de la duda

    • gonzasilve dice:

      honestamente no sabria darte una acertada respuesta pues apenas estoy empezando con android pero no he realizado alguna practica con bd. Saludos.

  11. darwin dice:

    hola gonzalo, es verdad el aporte que haz hecho es muy interesante, porfas si pudieras enviarme los cdigo a mi correo, xfa y gracias

    • gonzasilve dice:

      …apenas te escribo pero como podras comprobar en tu corre ya estan desde hae muucho. Saludos cordiales

  12. Sarah dice:

    Hola gonzalo!!!!!

    Mi pregunta es la siguiente hay alguna forma de vaciar las rutas donde se guardan los registro
    por que mira que yo borro todos los registros de la base, luego ejecuto el programa inmediatamente me sigue mostrando los registros que ya elimine voy a mi base y me vuelven aparecer los registros eliminados………
    si puedes ayudarme con eso por fa te lo agradeceria de todo corazon
    Gracias ….

    • gonzasilve dice:

      prueba usando otro navegador, posiblemente solo sea la cache. Saludos

  13. Alberto dice:

    Hola Gonzalo, muy buen aporte. también te pido el favor de enviarme el código a mi correo: yosoyalberto@hotmail.es

    • gonzasilve dice:

      Alberto! tambien te lo acabo de enviar. gracias x tu visita

      • Alberto dice:

        Muchas gracias Gonzalo!! Se agradece ehhh, he podido resolver la duda que tenía viendo tu código, mil gracias!!

  14. Diego dice:

    hola….porfa me podrias enviar el codigo del ejemplo a mi mail: diegoguamandk22@gmail.com por favor…………………..

    • gonzasilve dice:

      Diego! ..te envie el codigo, revisa tu buzon electronico. Saludos

  15. lili dice:

    hola m puedes mandar tu codigo al correo lili_grande7891@hotmail.com de como guardar la ruta de una imagen n mysql.. porfavor…

    • lili dice:

      gracias por enviarmelo……….con este codigo en java esque puedo cargar una imagen y q la ruta se guarde en mi base de datos mysql…….

  16. Sandra dice:

    Hola muy buen aporte podrias enviarme el.java a mi correo virgo_yram@hotmail.es te lo agradeceria.

    • gonzasilve dice:

      ya debe estar en tu email!. Saludos

  17. inaxio dice:

    puedes enviarme el codigo? A igryamakazi@gmail.com muchas gracias

    • gonzasilve dice:

      te lo envie

  18. thenaser dice:

    buen aporte amigo, oye puedes pasarme tus .java para estudiarlos a detalle ya ke es divertido trabajar con java thenaser666@hotmail.com gracias de ante mano

  19. momo dice:

    hola todos me gustaria saber como guardar la ruta del archivo en mysql pero ejecutable la podemos ejecutar de la Jtable muchas gracias

  20. maomurcia dice:

    hola gonzalo como puedo adecuar este codigo para 6.8

    • gonzasilve dice:

      ¿?

  21. maomurcia dice:

    eres exccelemte gonzalo me llego tu correo de autenticacion de usuario buenisimo, muchas gracias……..

  22. cristhiam dice:

    oye me sirvio tu codigo de guia, mi programa lista registros guardados, pero no puedo cuadrar para que me muestre la dirección de l aimagen, me podrías colaborar?

  23. katy dice:

    puedes enviarme tu código? mi correo es clavitostar@hotmail.com Gracias de antemano .

  24. Karyme dice:

    hola creo hace tiempo de tu publicación, corri tus codigos y me marca un error me dice:
    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    el cambie la base de datos por la mia, mi contraseña y todo y no corre, la verdad eh tenido muchos problemas con la insercion de datos, espero y agradeceria mucho tu ayuda

  25. iscJavier dice:

    Que tal, saludos esta interesante, puedes enviarme los códigos para revisar esta interesante.

  26. Fidel dice:

    Hola¡ y muy buen post, me gustaria saber si puedes ayudar con este codigo, todo funciona perfectamente
    solo me guataria que si no hay nada en la base de datos con las caracteristicas de la busqueda me dijeras
    que codigo tendria que poner para que me diga no hay registro con esas caracteristicas de busqueda.
    Muchas Gracias, me harias un gran favor.
    Fidel

    <?php
    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
    {
    if (PHP_VERSION


    Agenda


    Listado
    Administrador
    Contactar



     

    <img src="” alt=”” />

     
     
     
     



     

    Copyright (c) 2011 Figardi

  27. brunn dice:

    Tu código está genial, justo buscaba algo así porque ahora me toca hacer una db para el listado de productos de una empresa con todo e imágenes. ¿Sería posible que me pasaras los .java? Intenté seguirlos tal cual pero no logro hacerlo funcionar como se muestra en tus imágenes. Como quiera seguiré revisando el código a ver si doy con el error.
    Gracias por compartir :)

    • gonzasilve dice:

      ok amigo te mando el codigo que me pides, revisa tu mail.

      gracias x visitar mi blog, suerte

  28. Fidel dice:

    Puedes adjuntar los archivos, en un fichero rar para poder bajarlos.
    Gracias Fidel

  29. David dice:

    hola .esta muy bueno . oye necesito algo asi parecido a este programa. pero sigo tus paso y me da un error, que no tengo la menor idea q es. si me pudieras ayudar mandandome el q vos tenes en winrar al correo seria super genial . te lo agradeceria incleiblemente, lo necesito para mi estudio de la U . porfa . gracias de ante mano.

    • gonzasilve dice:

      te acabo en enviar los fuentes a tu correo. saludos y grax x pasar por aqui

  30. carlos dice:

    Saludos Gonzalo.
    Muy buen codigo te jalaste.
    he estado buscando acerca de la ruta de las imagenes hacia Mysql con PHP.
    Te pregunto si has intentado esto y si es asi me podrias dar una pista de como colocar el codigo
    en php -el action- para que en el campo imagen de la tabla de Mysql reciba la ruta donde esta alojada la imagen
    gracias
    krls

    • gonzasilve dice:

      mmm es algo muuy similar. deja hago un ejemplo y lo subo mantente pendiente. ok. saludos

      • carlos dice:

        Saludos Gonzalo
        Gracias por tu respuesta, he leido el codigo del ejemplo puesto arriba 3 veces con el fin de encontrar un parecido pero no.. lo que investigado en los foros dicen que se debe colocar un tag <img src="imagen/

        con esto la ruta es el directorio o folder IMAGEN y php nos envia el contenido de [foto]
        y en el campo de mysql , en la tabla se debe colocar varchar(100) e ingresar por ejemplo foto.jpg

        es decir esta todo como por pedazos.
        y el ejemplo que colocas arriba esta muy bien explicado , esa es la manera de ayudar a otros a que avancen.
        De todas maneras estoy atento a tu publicacion, gracias de nuevo.
        Carlos

  31. H4CK-4-LIF3 dice:

    muy buenos Xd tus archivossss,yo estoy haciendo lo mismo men,yo quisiera saber como se actualiza un jcombobox de la base de datos,osea que mande a llamar al metodo getselectindex();y que al añadirlo de otra parte me lo agregre l item a mi jcombobox pero ps aver si tienes un ejemplo me lo muestras si no es mx molestia saludos y gracias por compartir…..

    • ricardo dice:

      necesito el codigo java si me lo podris fecilitar exm.1@hotmail.com

      • gonzasilve dice:

        enviado!!

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 374 seguidores

%d personas les gusta esto: