Subiendo Imágenes y Archivos a MySQL con PHP y JSP y desplegándolos en RTF


En este tutorial vamos a demostrar como através de JSP y PHP subir imágenes 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 imágenes y archivos de texto probablemente éstos tengan un tamaño considerable, es decir, no tan pequeños. 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, através de la modificación del archivo my.ini que se encuentra en el folder de instalación de MySQL, para ello buscamos la entrada [mysqld] y justo debajo le indicamos que el paquete máximo permitido sea de 2MB añadiendo la línea:
max_allowed_packet=2M

Para JSP es suficiente con incluir las librerías 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 instalación de Tomcat.

Para PHP se necesitan hacer unos ajustes en su archivo de configuración php.ini. Dependiendo de la cantidad de archivos a subir y del tamaño 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 algún momento se deberá establecer un tope máximo de subida y es aquí donde esas variables son obligadas. También es necesario considerar los tiempos involucrados en dichas subidas debido al tamaño 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 están involucradas las variables en cuanto a demora y duración 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 instalación, verificamos los usuarios y sin problemas creamos el nuestro concediéndole 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 importación de librerías:

<%@ 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 gestión de subida de archivos y otros parámetros como campos de formularios, etc.
La importación java.sql obviamente para la gestión de consultas hacia MySQL.
La importación java.util para manejo de iteraciones y la importación java.io lectura y escritura de archivos.
La inclusión 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 importación de librerías de esta manera. Solo la inclusión del archivo RTF.php de funciones para RTF.

<?php require("RTF.php"); ?>

Ahora detallo lo referente al código 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 además de los campos que nos permitirán 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 numérico
Fecha Ingreso; de tipo Fecha
Foto Reciente; de tipo Binario
Resumen; de tipo Texto.
Además tres botones que nos permitirán: ingresar un registro, listar los registros generando un archivo RTF y borrar los registros.
Con esto cubrimos acciones básicas 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 parámetros “básicos” del formulario de HTML, sino los archivos para los campos “input” de tipo “File”. Poniéndolos en un HashTable para su posterior uso, haciéndo obviamente una discriminación entre ellos.

Script PHP (Personal.php)
Ahora creamos la conexión a MySQL que nos permita realizar la opción según el botón presionado en el formulario. Téngase en cuenta que los parámetros 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 Inserción 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,$BytesResumen);
        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("Inserción Exitosa!<br/>");
        }else {
          printf("Error: (%d) %s",$Enlace->errno,$Enlace->error);
          exit();
        }
        $Enunciado->close();
        $Enlace->close();
      }

Si el botón que se presionó fue bCargar, es porque se desea insertar un registro.
Dado que para la inserción de un archivo primero debemos pasar por una serie de funciones, usamos el método prepare para realizar una inserción con formato.
Inicializamos las variables a utilizar y luego hacemos una correspondencia entre ellas y los valores para la sentencia de MySQL con el método bind_param.
Luego hacemos las lecturas con la función is_uploaded_file de los archivos de Imagen y de Texto y asignándolos a su variable respectiva.
Con todas las variables y sus valores respectivos asignados, ejecutamos el enunciado con el método Execute. Si no hay ningún error, la inserción 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("Inserción 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 más simple aunque el principio es el mismo; tomando el valor respectivo del Hashtable Parameters. La inserción con formato se hace con el método prepareStatement. Se puede notar que la lectura del archivo puede llevarse de inmediato a la variable correspondiente según la misma con setString, setInt, setBinaryStream. Finalmente realizamos la inserción con el método executeUpdate

Script JSP (Personal.jsp)
Seguimos ahora con la extracción de los registros que están 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*/,/*Tamaño 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()){
              //sTablIH(/*EspMd*/,/*Posic*/,/*Align*/,/*Borde*/,/*Grosor*/,/*Color*/)
              //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 Línea
              bw.write(sTexto(FrmtCampo+FrmtTexto,"Nombre: "));
              bw.write(sTexto(FrmtValor+FrmtTexto,Resultado.getString(1)));
              bw.write(sNLinea);
              bw.write(sTexto(FrmtCampo+FrmtTexto,"Salario: "));
              bw.write(sTexto(FrmtValor+FrmtTexto,String.valueOf(Resultado.getInt(2))));
              bw.write(sNLinea);
              sBytesIMG = ByteStreamImageString(Resultado.getBytes(4),iFormato,iAlto,iAncho);
              InfImagenIMG = RTFImagen(sBytesIMG,iFormato[0],iAlto[0],iAncho[0],100,100,iAlto[0]*10,iAncho[0]*10,0,0,0,0);
              bw.write(InfImagenIMG);
              bw.write(sTexto(FrmtCampo+FrmtTexto,"Resumen: "));
              bw.write(sTexto(FrmtValor+FrmtTexto,Resultado.getString(5)));
              NumRegistros--;
              if (NumRegistros>0){
                bw.write(sNPagina);//Nueva Página
              }
            }
            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 botón bListar, el usuario desea producir un archivo RTF con todos los registros que están 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 almacenándola 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 insertarán 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 básicos de nuestro archivo, uno para el título 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 método prepareStatement y la ejecutamos con executeQuery.
Almacenamos el resultado en la variable Resultado. Para no insertar una página en blanco al final necesitamos saber cuantos registros arrojó la consulta, para ello invocamos el método last, almacenamos el número de la fila en NumRegistros con getRow y posteriormente beforeFirst para poder llamar el método next.
Insertamos los campos y el valor de cada registro teniendo en cuenta el tipo de cada uno de ellos.
La inserción de texto, de conformación de tabla, celdas y su contenido se hacen a continuación, según 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,$iAncho*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,$iAncho*10,0,0,0,0);
          $sBytesIMG = NULL;
          $InfImagenIMG = NULL;
          //sFrmtBS(/*Alineacion*/,/*Color Frontal*/,/*Color Fondo*/,/*Tipo Fuente*/,/*Tamaño 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()) {
              //sTablIH(/*EspMd*/,/*Posic*/,/*Align*/,/*Borde*/,/*Grosor*/,/*Color*/)
              //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 Línea
              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,$iAncho*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 Página
              }
            }
            $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 método prepare se prepara la consulta, se realiza con el método execute y se asigna a la variable respectiva el valor de cada campo con el método bind_result; como necesitamos saber el número de registros obtenidos invocamos el método num_rows no sin antes invocar el método 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("Eliminación Exitosa!<br/>");
      }
    ?>

Para la eliminación se determina si el botón presionado es bBorrar, luego se establece la consulta y se ejecuta almacenándose el resultado con el fin de derminar si fue exitoso o fallido, en ambos casos se desplegará un mensaje según su valor.

Script JSP (Personal.jsp)

        if((String)Parameters.get("bBorrar")!=null){
          try {
            Enunciado = Conexion.createStatement();
            Enunciado.executeUpdate("DELETE FROM Registros");
            out.println("Eliminación Exitosa!<br/>");
          }
          catch (SQLException e) { out.println(e.toString()); }
        }
      }
    %>

De igual forma se realiza la eliminación de los registros en JSP.
Con esto hemos finalizado nuestro tutorial.

Anuncios

Acerca de joseluisbz

Hasta ahora, espero actualizarlo después, ahora no.
Esta entrada fue publicada en JSP, MySQL, PHP, RTF, Server, Servidores Web, Software y etiquetada , , , , , , , , , , . Guarda el enlace permanente.

11 respuestas a Subiendo Imágenes y Archivos a MySQL con PHP y JSP y desplegándolos en RTF

  1. Ramiro Balmaceda dijo:

    Muchas gracias por el aporte..

  2. MDR dijo:

    Buenisimo!!

  3. wilisao dijo:

    por favor me puden enviar el archivo ya programado esque le puse tal como esta y me da problema gracias este es mi correo williamvilla007@gmail.com

  4. joseluisbz dijo:

    Hola, puedes verificar el post que está en inglés, está en un paquete y es más sencillo.
    Working RTF, HTML, CSS and Script Files with my own Packages Java and PHP

    Podrías decirme en que SO estás trabajando y que tipo de error te sale?

    • william dijo:

      estoy con linux lo que sucede copie como tal esta y hay cosas uqe le sale mal

    • william dijo:

      ya me craga todo bien lo que cuando pongo listar me sale este mensaje

      /var/www/educaciononline/Files/PHP.Personal.RTF (El sistema no puede encontrar la ruta especificada)

      • joseluisbz dijo:

        Que pena William responderte a esta altura de tiempo.
        El archivo PHP.Personal.RTF está ideado para que sea generado en la misma ubicación del paquete, por ejemplo si usas bz-htmlcss2rtf.phar este también debe estar en /var/www/educaciononline/Files…

        Este paquete no lo he probado en Linux aún aunque he tratado de que sea independiente de Windows…

  5. william dijo:

    muy bueno

    Una pregunta como hago para grabar dos archivos de tipo pdf
    como pude ser documento 1,documento 2 de una misma persona y luego listarlo por medio de un codigo los archivos guardados mil gracias si me ayudas

  6. Sergio Uribe dijo:

    Hola:
    Este script me está marcando muchos errores:
    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(“Inserción Exitosa!”);
    }
    catch (SQLException e) { out.println(e.toString()); }
    catch (Exception e) { out.println(e.toString()); }
    finally {
    PE.close();
    Conexion.close();
    }
    }

    Veo que faltan comillas, paréntesis y llaves, pero al ponérsela, en las líneas que dicen “(String)Parameters.get” indicar que hay un error porque el término ‘Parameters’ no se reconoce…
    Insisto como Wilisao: ¿Tienes este mismo ejemplo que estás poniendo en este post que nos puedas compartir por favor y que sea funcional?
    Muchas gracias de antemano, mi correo es: suribe1825@hotmail.com

Responder

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