En este tutorial vamos a demostrar como atravs de JSP y PHP subir imgenes y archivos de texto al servidor, insertarlos en bases de datos de MySQL, luego obtenerlos para desplegarlos en archivos tipo RTF. Como vamos a subir imgenes y archivos de texto probablemente stos tengan un tamao considerable, es decir, no tan pequeos. Por lo que debemos hacer algunos cambios en nuestras configuraciones anteriormente detalladas. Primero tener presente que finalmente los archivos van a ser almacenados en MySQL, esto quiere decir que debemos indicarle eso, atravs de la modificacin del archivo my.ini que se encuentra en el folder de instalacin de MySQL, para ello buscamos la entrada [mysqld] y justo debajo le indicamos que el paquete mximo permitido sea de 2MB aadiendo la lnea: max_allowed_packet=2M Para JSP es suficiente con incluir las libreras commons-fileupload-1.2.2.jar (que viene dentro del archivo commons-fileupload-1.2.2-bin.zip) y commons-io-2.0.1.jar (que viene dentro del archivo commons-io-2.0.1-bin.zip) dentro del folder \lib en la carpeta de instalacin de Tomcat. Para PHP se necesitan hacer unos ajustes en su archivo de configuracin php.ini. Dependiendo de la cantidad de archivos a subir y del tamao de cada uno de ellos, ser necesario cambiar las variables post_max_size que inicialmente tiene un valor de 8M y upload_max_filesize que inicialmente tiene un valor de 2M. Obviamente en algn momento se deber establecer un tope mximo de subida y es aqu donde esas variables son obligadas. Tambin es necesario considerar los tiempos involucrados en dichas subidas debido al tamao y ancho de banda disponible para ello. Por ahora cambiemos estos valores as: ; post_max_size = 8M post_max_size = 16M y ; upload_max_filesize = 2M upload_max_filesize = 16M Teniendo en cuenta que estn involucradas las variables en cuanto a demora y duracin del Script: max_execution_time = 30 y max_input_time = 60. Ahora ingresamos a MySQL y creamos una base de datos donde podamos hacer las demostraciones del tutorial. Primero Verificamos las bases de datos de MySQL, aunque este paso es opcional SHOW DATABASES; Luego creamos nuestra base de datos, en mi caso se llamar Empresa CREATE DATABASE Empresa; Ahora usamos la Base de datos recien creada y creamos una tabla de prueba llamada Registros. USE Empresa; CREATE TABLE Registros (Nombre varchar(30),Salario int(11), Ingreso DATE,Foto MEDIUMBLOB,Resumen MEDIUMTEXT); Igualmente como en el proceso de instalacin, verificamos los usuarios y sin problemas creamos el nuestro concedindole los permisos a nuestra base de datos. GRANT ALL ON Empresa.* TO elusuario@localhost IDENTIFIED BY laclave;
Con la base de datos creada, la tabla y sus campos y el usuario que permite utilizarla podemos trabajar por medio de los scripts de JSP y de PHP. Script JSP (Personal.jsp) Como vamos a trabajar con la subida de archivos a MySQL con commons-fileupload- 1.2.2.jar y con commons-io-2.0.1.jar har un detalle no muy profundo de parte del Script. Primero la importacin de libreras: <%@ page import="org.apache.commons.fileupload.*" %> <%@ page import="org.apache.commons.fileupload.servlet.*" %> <%@ page import="org.apache.commons.fileupload.disk.*" %> <%@ page import="java.sql.*" %> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%@ include file="RTF.jsp" %> Las importaciones para org.apache.commons.fileupload son las que nos permiten la gestin de subida de archivos y otros parmetros como campos de formularios, etc. La importacin java.sql obviamente para la gestin de consultas hacia MySQL. La importacin java.util para manejo de iteraciones y la importacin java.io lectura y escritura de archivos. La inclusin del archivo RTF.jsp es para poder hacer uso de funciones inherentes al formato RTF. Script PHP (Personal.php) Para el caso de PHP, no es necesario hacer la importacin de libreras de esta manera. Solo la inclusin del archivo RTF.php de funciones para RTF. <?php require("RTF.php"); ?> Ahora detallo lo referente al cdigo HTML para nuestro formulario que nos permiten ingresar los campos: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html> <head> <title>Registros - <?php print $_SERVER['PHP_SELF']; ?></title> <meta http-equiv="Content-Type" content="text/html; charset=ISO- 8859-1" /> <link rel="shortcut icon" href="BZ.ico" type="image/x-icon" /> </head> <body> <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post" name="FormOperar" enctype="multipart/form-data"> Nombres y Apellidos: <input type="text" name="tNombre" value="" size="30" /><br/> Valor Salario: <input type="text" name="tSalario" value="" size="11" /><br/> Fecha Ingreso: <input type="text" name="tIngreso" value="" size="10" /><br/> Foto Reciente: <input type="file" name="fFoto" value="" size="60" /><br/> Resumen: <input type="file" name="fResumen" value="" size="60" /><br/> <input type="submit" name="bCargar" value="Cargar Datos" style="FONT-SIZE: 8pt; FONT-FAMILY: Courier"/><br/> <input type="submit" name="bListar" value="Listar Datos" style="FONT-SIZE: 8pt; FONT-FAMILY: Courier"/><br/> <input type="submit" name="bBorrar" value="Borrar Datos" style="FONT-SIZE: 8pt; FONT-FAMILY: Courier"/><br/> </form>
Como podemos ver adems de los campos que nos permitirn ingresar los valores a los campos definidos anteriormente a la base de datos Empresa he dispuesto un cono distintivo para nuestros Scripts llamado realmente BZ.ico. Nombres y Apellidos; de tipo Texto Valor Salario; de tipo numrico Fecha Ingreso; de tipo Fecha Foto Reciente; de tipo Binario Resumen; de tipo Texto. Adems tres botones que nos permitirn: ingresar un registro, listar los registros generando un archivo RTF y borrar los registros. Con esto cubrimos acciones bsicas pero importantes en nuestra base de datos en MySQL. Script JSP (Personal.jsp) Para el caso de JSP es similar a PHP solo lo referente al lenguaje en si: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html> <head> <title>Registros - <% out.println(request.getServletPath()); %></title> <meta http-equiv="Content-Type" content="text/html; charset=ISO- 8859-1" /> <link rel="shortcut icon" href="BZ.ico" type="image/x-icon" /> </head> <body> <form action="<% out.println(request.getServletPath()); %>" method="post" name="FormOperar" enctype="multipart/form-data"> Nombres y Apellidos: <input type="text" name="tNombre" value="" size="30" /><br/> Valor Salario: <input type="text" name="tSalario" value="" size="11" /><br/> Fecha Ingreso: <input type="text" name="tIngreso" value="" size="10" /><br/> Foto Reciente: <input type="file" name="fFoto" value="" size="60" /><br/> Resumen: <input type="file" name="fResumen" value="" size="60" /><br/> <input type="submit" name="bCargar" value="Cargar Datos" style="FONT-SIZE: 8pt; FONT-FAMILY: Courier"/><br/> <input type="submit" name="bListar" value="Listar Datos" style="FONT-SIZE: 8pt; FONT-FAMILY: Courier"/><br/> <input type="submit" name="bBorrar" value="Borrar Datos" style="FONT-SIZE: 8pt; FONT-FAMILY: Courier"/><br/> </form>
Ahora la parte de captura de los campos de nuestro formulario: <% if(ServletFileUpload.isMultipartContent(request)){ ServletFileUpload SFileUpload = new ServletFileUpload(new DiskFileItemFactory()); Iterator iter = null; Hashtable Parameters = new Hashtable(); try{ iter = SFileUpload.parseRequest(request).iterator(); FileItem FItem = null; while(iter.hasNext()){ FItem = (FileItem)iter.next(); if (FItem.isFormField() ){ Parameters.put(FItem.getFieldName(), FItem.getString()); } else { if (FItem.getFieldName().equals("fFoto")){ Parameters.put(FItem.getFieldName(), FItem.getInputStream()); } if (FItem.getFieldName().equals("fResumen")){ Parameters.put(FItem.getFieldName(), FItem.getString("ISO-8859-1")); } } } } catch(FileUploadException e){ out.println(e.toString()); } Lo que hace el Script anterior es crear un objeto con el que podamos obtener no solo los parmetros bsicos del formulario de HTML, sino los archivos para los campos input de tipo File. Ponindolos en un HashTable para su posterior uso, hacindo obviamente una discriminacin entre ellos. Script PHP (Personal.php) Ahora creamos la conexin a MySQL que nos permita realizar la opcin segn el botn presionado en el formulario. Tngase en cuenta que los parmetros para la base de datos Empresa es la misma que se realiz anteriormente. <?php $host = "localhost"; $User = "elusuario"; $Pass = "laclave"; $DB = "Empresa"; $Enlace = new mysqli($host,$User,$Pass,$DB); if ($Enlace->connect_error) { printf ("Connect Error: (%d) %s",$Enlace->connect_errno,$Enlace- >connect_error); exit(); } Script JSP (Personal.jsp) String host = "localhost"; String User = "elusuario"; String Pass = "laclave"; String DB = "Empresa"; try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { out.println(e.toString()); } Connection Conexion = null; Statement Enunciado = null; ResultSet Resultado = null; PreparedStatement PE = null; try{ Conexion = DriverManager.getConnection("jdbc:mysql://"+host+"/"+DB,User,Pass); } catch (SQLException e) { out.println(e.toString()); } Como se puede notar no es mucha la diferencia conceptualmente hablando, solo los objetos de los que posteriormente tendremos que hacer uso para nuestros objetivos. Script PHP (Personal.php) Ahora demostraremos el proceso de Insercin de un registro a la base de datos Empresa if (isset($_POST['bCargar'])){ $Enunciado = $Enlace->prepare("INSERT INTO Registros (Nombre,Salario,Ingreso,Foto,Resumen) VALUES(?,?,?,?,?)"); $sNombre = utf8_encode ($_POST['tNombre']); $sSalario = $_POST['tSalario']; $sIngreso = $_POST['tIngreso']; $BytesFoto = NULL; $BytesResumen = NULL;
$Enunciado- >bind_param('sisbb',$sNombre,$sSalario,$sIngreso,$BytesFoto,$BytesResu men); if (is_uploaded_file($_FILES['fFoto']['tmp_name'])){ $fiFoto = fopen($_FILES['fFoto']['tmp_name'], "rb"); if ($fiFoto!=false){ while (!feof($fiFoto)){ $Enunciado->send_long_data(3, fread($fiFoto, 8192)); } fclose($fiFoto); } } else { printf("Error Upload File: (%d) %s",$HTTP_POST_FILES['fFoto']['error'],$Enlace->error); exit(); }
if (is_uploaded_file($_FILES['fResumen']['tmp_name'])){ $fiResumen = fopen($_FILES['fResumen']['tmp_name'], "rb"); if ($fiResumen!=false){ while (!feof($fiResumen)){ $Enunciado->send_long_data(4, fread($fiResumen, 8192)); } fclose($fiResumen); } } else { printf("Error Upload File: (%d) %s",$HTTP_POST_FILES['fResumen']['error'],$Enlace->error); exit(); }
if ($Enunciado->execute()) { print("Insercin Exitosa!<br/>"); }else { printf("Error: (%d) %s",$Enlace->errno,$Enlace->error); exit(); } $Enunciado->close(); $Enlace->close(); } Si el botn que se presion fue bCargar, es porque se desea insertar un registro. Dado que para la insercin de un archivo primero debemos pasar por una serie de funciones, usamos el mtodo prepare para realizar una insercin con formato. Inicializamos las variables a utilizar y luego hacemos una correspondencia entre ellas y los valores para la sentencia de MySQL con el mtodo bind_param. Luego hacemos las lecturas con la funcin is_uploaded_file de los archivos de Imagen y de Texto y asignndolos a su variable respectiva. Con todas las variables y sus valores respectivos asignados, ejecutamos el enunciado con el mtodo Execute. Si no hay ningn error, la insercin se habr realizado exitosamente. Script JSP (Personal.jsp) if((String)Parameters.get("bCargar")!=null){ try{ PE = Conexion.prepareStatement("INSERT INTO Registros (Nombre,Salario,Ingreso,Foto,Resumen) VALUES(?,?,?,?,?)"); String sNombre = (String)Parameters.get("tNombre"); String sSalario = (String)Parameters.get("tSalario"); String sIngreso = (String)Parameters.get("tIngreso"); InputStream isFoto = (InputStream)Parameters.get("fFoto"); String sResumen = (String)Parameters.get("fResumen"); PE.setString(1,sNombre); PE.setInt(2,Integer.parseInt(sSalario)); PE.setString(3,sIngreso); PE.setBinaryStream(4,isFoto); PE.setString(5,sResumen); PE.executeUpdate(); out.println("Insercin Exitosa!<br/>"); } catch (SQLException e) { out.println(e.toString()); } catch (Exception e) { out.println(e.toString()); } finally { PE.close(); Conexion.close(); } } Para el caso de JSP el caso es ms simple aunque el principio es el mismo; tomando el valor respectivo del Hashtable Parameters. La insercin con formato se hace con el mtodo prepareStatement. Se puede notar que la lectura del archivo puede llevarse de inmediato a la variable correspondiente segn la misma con setString, setInt, setBinaryStream. Finalmente realizamos la insercin con el mtodo executeUpdate Script JSP (Personal.jsp) Seguimos ahora con la extraccin de los registros que estn en la base de datos: if((String)Parameters.get("bListar")!=null){ String FS = System.getProperty("file.separator");//Separador de Archivo o de Directorio //Buscar ruta del Script String ScriptRoot = application.getRealPath(""); ScriptRoot = ScriptRoot.replace("\\",FS);//Reemplaza \ por FS ScriptRoot = ScriptRoot.replace("/",FS);//Reemplaza / por FS String FileName = "JSP.Personal.RTF"; String FullFileName = ScriptRoot+FS+"Files"+FS+FileName; String ImageJPG = ScriptRoot+FS+"joseluisbz.jpg"; String ImagePNG = ScriptRoot+FS+"Empresa.png"; try { BufferedWriter bw = new BufferedWriter(new FileWriter(FullFileName)); bw.write(sHeader); int[] iFormato = new int[1]; int[] iAlto = new int[1]; int[] iAncho = new int[1]; String sBytesJPG = ByteFileImageString(ImageJPG,iFormato,iAlto,iAncho); if (sBytesJPG.equals("Error")){ out.println("Error: el Archivo "+ImageJPG+" no es PNG o JPG"); System.exit(0); } String InfImagenJPG = RTFImagen(sBytesJPG,iFormato[0],iAlto[0],iAncho[0],100,100,iAlto[0]*10 ,iAncho[0]*10,0,0,0,0); String sBytesPNG = ByteFileImageString(ImagePNG,iFormato,iAlto,iAncho); if (sBytesPNG.equals("Error")){ out.println("Error: el Archivo "+ImagePNG+" no es PNG o JPG"); System.exit(0); } String InfImagenPNG = RTFImagen(sBytesPNG,iFormato[0],iAlto[0],iAncho[0],100,100,iAlto[0]*10 ,iAncho[0]*10,0,0,0,0); String sBytesIMG; String InfImagenIMG; //sFrmtBS(/*Alineacion*/,/*Color Frontal*/,/*Color Fondo*/,/*Tipo Fuente*/,/*Tamao Fuente*/); String FrmtTitle = sFrmtBS(1,1,2,5,20); String FrmtTexto = sFrmtBS(2,1,2,4,12); //sFrmtSP(/*Negrita*/,/*Italica*/,/*Subrayado*/); String FrmtEspec = sFrmtSP(1,0,0); String FrmtCampo = sFrmtSP(0,0,1); String FrmtValor = sFrmtSP(0,1,0); PE = Conexion.prepareStatement("SELECT * FROM Registros"); Resultado = PE.executeQuery(); Resultado.last(); int NumRegistros = Resultado.getRow();Resultado.beforeFirst(); while(Resultado.next()){
//sCeldaH(/*Ancho*/,/*Mezcla*/,/*AligV*/,/*Borde*/,/*Grosr*/,/*Color*/ ) bw.write(sTexto(FrmtTitle+FrmtEspec,"Empresa Limitada")); bw.write(sNParag); bw.write(sTablIH(10,10,1,1,10,2));//Inicio Cabecera de Tabla bw.write(sCeldaH(4000,0,0,2,10,2)); bw.write(sCeldaH(8000,0,0,2,10,2)); bw.write(sTablFH());//Fin Cabecera de Tabla bw.write(sCeldaC(sFrmtBS(1,0,0,0,0),InfImagenPNG)); bw.write(sCeldaC(sFrmtBS(1,0,0,0,0),InfImagenJPG)); bw.write(sTablFF());//Fin de Tabla bw.write(sNLinea+sNLinea);//2 Saltos de Lnea bw.write(sTexto(FrmtCampo+FrmtTexto,"Nombre: "));
bw.write(sTexto(FrmtValor+FrmtTexto,Resultado.getString(5))); NumRegistros--; if (NumRegistros>0){ bw.write(sNPagina);//Nueva Pgina } } bw.write(sFooter); bw.close(); out.println("<a href=\"http://localhost/"+"Files"+"/"+FileName+"\">http://localhost/"+ "Files"+"/"+FileName+"</a><P>"); } catch (Exception e) { out.println(e.toString()); } } Si se ha presionado el botn bListar, el usuario desea producir un archivo RTF con todos los registros que estn en la base de datos. Primero almacenamos en FS la manera en la que el sistema operativo delimita los directorios, subdirectorios y archivos; en Windows es con \ en Linux es con /. Luego determinamos la ruta de alojamiento del Script almacenndola en una variable llamada ScriptRoot, luego actualizamos la manera en que nuestro PHP o JSP presenta el delimitador de directorios y archivos a la manera del Sistema Operativo. Se crear un archivo RTF llamado JSP.Personal.RTF y se almacenar en un subdirectorio llamado Files en la misma ruta donde se aloja este script. ImageJPG y ImagePNG son archivos que se insertarn en el RTF. FullFileName se crea el archivo RTF. Las variables iFormato, iAlto, iAncho nos permiten pasar por referencia el formato, el alto y el ancho de la imagen que se insertar. ByteFileImageString Obtiene los bytes del archivo imagen, el formato, el alto y el ancho. RTFImagen es una cadena de texto que representa la imagen la imagen a insertar en el archivo con sus respectivos formatos. FrmtTitle y FrmtTexto son los formatos bsicos de nuestro archivo, uno para el ttulo y el otro para el texto en general. sFrmtSP, FrmtCampo y FrmtValor son formatos especiales que nos permiten hacer modificaciones adicionales a nuestro texto. Preparamos la consulta con formato usando el mtodo prepareStatement y la ejecutamos con executeQuery. Almacenamos el resultado en la variable Resultado. Para no insertar una pgina en blanco al final necesitamos saber cuantos registros arroj la consulta, para ello invocamos el mtodo last, almacenamos el nmero de la fila en NumRegistros con getRow y posteriormente beforeFirst para poder llamar el mtodo next. Insertamos los campos y el valor de cada registro teniendo en cuenta el tipo de cada uno de ellos. La insercin de texto, de conformacin de tabla, celdas y su contenido se hacen a continuacin, segn lo descrito el Script de RTF. Una vez finalizado publicamos el enlace con la que el usuario puede acceder al archivo RTF creado. Script PHP (Personal.php) La forma en que PHP crea el archivo RTF para extraer los registros y presentarlos es muy similar a la que los realiza JSP. if (isset($_POST['bListar'])){ $FS = DIRECTORY_SEPARATOR;//Separador de Archivo o de Directorio //Buscar ruta del Script $ScriptRoot = getenv("DOCUMENT_ROOT"); $ScriptRoot = str_replace("/",$FS,$ScriptRoot);//Reemplaza / por $FS $ScriptRoot = str_replace("\\",$FS,$ScriptRoot);//Reemplaza \ por $FS $FileName = "PHP.Personal.RTF"; $FullFileName = $ScriptRoot.$FS."Files".$FS.$FileName; $ImageJPG = $ScriptRoot.$FS."joseluisbz.jpg"; $ImagePNG = $ScriptRoot.$FS."Empresa.png"; $fw = fopen($FullFileName, "wb"); if($fw){ fwrite($fw,$sHeader); $iFormato = NULL; $iAlto = NULL; $iAncho = NULL; $sBytesJPG = ByteFileImageString($ImageJPG,$iFormato,$iAlto,$iAncho); if (strcmp($sBytesJPG,"Error")==0){ print("Error: el Archivo ".$ImageJPG." no es PNG o JPG"); exit(); } $InfImagenJPG = RTFImagen($sBytesJPG,$iFormato,$iAlto,$iAncho,100,100,$iAlto*10,$iAnch o*10,0,0,0,0); $sBytesPNG = ByteFileImageString($ImagePNG,$iFormato,$iAlto,$iAncho); if (strcmp($sBytesPNG,"Error")==0){ print("Error: el Archivo ".$ImagePNG." no es PNG o JPG"); exit(); } $InfImagenPNG = RTFImagen($sBytesPNG,$iFormato,$iAlto,$iAncho,100,100,$iAlto*10,$iAnch o*10,0,0,0,0); $sBytesIMG = NULL; $InfImagenIMG = NULL; //sFrmtBS(/*Alineacion*/,/*Color Frontal*/,/*Color Fondo*/,/*Tipo Fuente*/,/*Tamao Fuente*/); $FrmtTitle = sFrmtBS(1,1,2,5,20); $FrmtTexto = sFrmtBS(2,1,2,4,12); //sFrmtSP(/*Negrita*/,/*Italica*/,/*Subrayado*/); $FrmtEspec = sFrmtSP(1,0,0); $FrmtCampo = sFrmtSP(0,0,1); $FrmtValor = sFrmtSP(0,1,0);
if ($Enunciado = $Enlace->prepare("SELECT * FROM Registros")) { $Enunciado->execute(); $Enunciado- >bind_result($sNombre,$sSalario,$sIngreso,$BytesFoto,$BytesResumen); $Enunciado->store_result(); $NumRegistros = $Enunciado->num_rows; while ($Enunciado->fetch()) {
//sCeldaH(/*Ancho*/,/*Mezcla*/,/*AligV*/,/*Borde*/,/*Grosr*/,/*Color*/ ) fwrite($fw,sTexto($FrmtTitle.$FrmtEspec,"Empresa Limitada")); fwrite($fw,$sNParag); fwrite($fw,sTablIH(10,10,1,1,10,2));//Inicio Cabecera de Tabla fwrite($fw,sCeldaH(4000,0,0,2,10,2)); fwrite($fw,sCeldaH(8000,0,0,2,10,2)); fwrite($fw,sTablFH());//Fin Cabecera de Tabla fwrite($fw,sCeldaC(sFrmtBS(1,0,0,0,0),$InfImagenPNG)); fwrite($fw,sCeldaC(sFrmtBS(1,0,0,0,0),$InfImagenJPG)); fwrite($fw,sTablFF());//Fin de Tabla fwrite($fw,$sNLinea.$sNLinea);//2 Saltos de Lnea fwrite($fw,sTexto($FrmtCampo.$FrmtTexto,"Nombre: "));
fwrite($fw,sTexto($FrmtValor.$FrmtTexto,utf8_decode($sNombre))); fwrite($fw,$sNLinea); fwrite($fw,sTexto($FrmtCampo.$FrmtTexto,"Salario: ")); fwrite($fw,sTexto($FrmtValor.$FrmtTexto,$sSalario)); fwrite($fw,$sNLinea); $sBytesIMG = ByteStreamImageString($BytesFoto,$iFormato,$iAlto,$iAncho); $InfImagenIMG = RTFImagen($sBytesIMG,$iFormato,$iAlto,$iAncho,100,100,$iAlto*10,$iAnch o*10,0,0,0,0); fwrite($fw,$InfImagenIMG); fwrite($fw,sTexto($FrmtCampo.$FrmtTexto,"Resumen: ")); fwrite($fw,sTexto($FrmtValor.$FrmtTexto,$BytesResumen)); $NumRegistros--; if($NumRegistros>0){ fwrite($fw,$sNPagina);//Nueva Pgina } } $Enunciado->close(); } fwrite($fw,$sFooter); fclose($fw); print("<a href=\"http://localhost/"."Files"."/".$FileName."\">http://localhost/" ."Files"."/".$FileName."</a><P>"); } else { print($FullFileName." (El sistema no puede encontrar la ruta especificada)"); exit(); } } Con el mtodo prepare se prepara la consulta, se realiza con el mtodo execute y se asigna a la variable respectiva el valor de cada campo con el mtodo bind_result; como necesitamos saber el nmero de registros obtenidos invocamos el mtodo num_rows no sin antes invocar el mtodo store_result para que el valor de las filas correspondiente a cada registra no sea cero. if (isset($_POST['bBorrar'])){ $Consulta = "DELETE FROM Registros"; $Resultado = $Enlace->query($Consulta); if (!$Resultado) { printf("Error: (%d) %s",$Enlace->errno,$Enlace->error); exit(); } print("Eliminacin Exitosa!<br/>"); } ?> Para la eliminacin se determina si el botn presionado es bBorrar, luego se establece la consulta y se ejecuta almacenndose el resultado con el fin de derminar si fue exitoso o fallido, en ambos casos se desplegar un mensaje segn su valor. Script JSP (Personal.jsp) if((String)Parameters.get("bBorrar")!=null){ try { Enunciado = Conexion.createStatement(); Enunciado.executeUpdate("DELETE FROM Registros"); out.println("Eliminacin Exitosa!<br/>"); } catch (SQLException e) { out.println(e.toString()); } } } %> De igual forma se realiza la eliminacin de los registros en JSP. Con esto hemos finalizado nuestro tutorial. Fuente: http://joseluisbz.wordpress.com/2011/03/19/subiendo-imagenes-y-archivos-a- mysql-con-php-y-jsp-y-desplegandolos-en-rtf/