Subiendo Imágenes (PNG y JPG) y Archivos a MySQL con PHP y JSP y mostrarlos en RTF usando clases


Este tutorial explica usando clases como subir fotos o imágenes tipo PNG o JPG a una base de datos de MySQL, desplegarlos en un arvhivo de tipo RTF, bien sea directamente desde el sistema de archivos del Sistema Operativo o desde una base de datos de MySQL. Además establece dinámicamente la disposición de archivos para lectura de las imágenes que se van a subir y la escritura de archivos RTF generados.
Como hemos venido trabajando con PHP y JSP esta entrada no será la excepción.

Primero que todo comentaré unos cambios con respecto a la publicación anterior de este mismo tema.
Incluí un archivo llamado Personal.html, mejoré la presentación del formulario usando css en un archivo llamado Personal.css.

Código CSS (Personal.css)
Este archivo de tipo Cascading Style Sheets detalla los elementos que se utilizan en los scripts JSP y PHP en lo referente al código HTML y también en el archivo llamado Personal.html.
No se explicará el código css pues no es la intención de esta publicación.

Table {
  border-width:2px;
  border-color:rgb(200,0,0);
  border-style:groove;
  padding:3px;
  margin:3px;
  width:690px;
}

FieldSet {
  border-color:rgb(0,0,0);
  border-style:ridge;
  border-width:2px;
  padding:3px;
  width:630px;
}

Th {
  height:32px;
  background-color:rgb(127,127,127);
  color:rgb(255,255,255);
  border-style:solid;
  border-width:2px;
  border-color:rgb(0,200,0);
  padding:3px;
  margin:3px;
  font-weight:bold;
}

Td {
  height:30px;
  text-align:left;
  vertical-align:bottom;
  border-width:2px;
  border-color:rgb(0,0,200);
  border-style:ridge;
  padding:3px;
  margin:3px;
}

Label {
  display: block;
  width: 180px;
  float: left;
  clear: both;
  text-shadow: rgb(196,196,196) 2px 2px;
}
Label:hover {
  text-decoration:blink;
  font-style:oblique;
  font-weight:bold;
}

Input.Texto {
  border-width:2px;
  border-color:rgb(127,127,127);
  border-style:inset;
}
Input.Texto:hover {
  background-color:rgb(240,240,240);
  border-style:outset;
}

Input.Boton {
  background-color:rgb(255,255,255);
  color:rgb(0,0,0);
  cursor:pointer;
  width:130px;
  padding:2px;
  border-width:5px;
  border-color:rgb(127,127,127);
  border-style:double;
  margin:1px;
  font-size: 8pt; 
  font-family: Courier;
}
Input.Boton:hover {
  background-color:rgb(0,0,0);
  color:rgb(255,255,255);
  font-weight:bold;
}

Input.File {
  border-width:2px;
  border-color:rgb(127,127,127);
  border-style:inset;
  cursor:pointer;
}
Input.File:hover {
  background-color:rgb(240,240,240);
  border-style:outset;
}

DIV.map {
  padding-top: 2px;
  padding-bottom: 2px;
  margin-top: 2px;
  margin-right: 0px;
  margin-bottom: 2px;
  margin-left: 2px;
  clear: both;
  text-shadow: rgb(196,196,196) 2px 2px;
}

#p1 {
  display: block; 
  white-space: nowrap; 
  text-indent: 0
}
#p1 A {
  text-decoration:underline;
}
#p1, #p1 A {
  color:rgb(32,32,255);
  font-size:16px;
  font-family: "Lucida Console", Monospace;
}

#p1 {
  text-align: left;
  margin: 2px 2px 2px 2px;
}

P.Mensaje {
  color:rgb(32,32,32);
  font-size:15px;
  font-family: "Courier New", Monospace;
  text-shadow: rgb(196,196,196) 2px 2px;
}

Código HTML (Personal.html)
Este archivo refleja en html “puro” nuestro formulario, también incluye “Cascading Style Sheets” según el archivo Personal.css anteriormente detallado. No explicaré el código html porque no es la intención de esta publicación.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>Registros - Personal.html</title>
    <!--
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    -->
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <link rel="stylesheet" href="Personal.css" type="text/css" />
    <link rel="shortcut icon" href="BZ.ico" type="image/x-icon" />
  </head>
  <body>
    <form method="post" name="FormOperar" enctype="multipart/form-data">
      <TABLE>
        <TR>
          <TH colspan="2">Datos Registros</TH>
        <TR>
          <TD colspan="2"><label for="Nombre">Nombres y Apellidos:</label><input type="text" id ="Nombre" name="tNombre" value="" size="30" class="Texto" />
        <TR>
          <TD><label for="Salario">Valor Salario:</label><input type="text" id="Salario" name="tSalario" value="" size="11" class="Texto" />
          <TD><label for="Ingreso">Fecha Ingreso:</label><input type="text" id="Ingreso" name="tIngreso" value="" size="10" class="Texto" />
        <TR>
          <TD colspan="2"><label for="Foto">Foto Reciente:</label><input type="file" id="Foto" name="fFoto" size="60" class="File" />
        <TR>
          <TD colspan="2"><label for="Resumen">Resumen:</label><input type="file" id="Resumen" name="fResumen" size="60" class="File" />
      </TABLE>
      <TABLE>
        <TR>
          <TH>Personal.jsp</TH>
          <TD><input type="submit" name="bCargar" value="Cargar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bListar" value="Listar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bBorrar" value="Borrar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bReset" value="Inicio JSP" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
        </TR>
        <TR>
          <TH>Personal.php</TH>
          <TD><input type="submit" name="bCargar" value="Cargar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bListar" value="Listar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bBorrar" value="Borrar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bReset" value="Inicio PHP" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
      </TABLE>
    </form>
  </body>
</html>

Script JSP (Personal.jsp)
Tal como hicimos en la entrada anterior usamos las mismo código para 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" %>

Ahora vamos a describir unas funciones en JSP que nos ayudan a entender mejor nuestro código:

<%!
  javax.servlet.jsp.JspWriter Out;
  String GetNameScript(String Script){
    return Script.substring(Script.lastIndexOf("/")+1,Script.length());
  }
  String GetPathScript(String Script){
    return Script.substring(0,Script.lastIndexOf("/")+1);
  }
  String GetStringProtocol(String Protocol){
    if (Protocol.equals("HTTP/1.1")) return "http://";
    return Protocol;
  }
  String GetStringPort(int Port){
    if (Port == 80) return "";
    return ":"+String.valueOf(Port);
  }
  void PrintMsg(String Msg){
    try {
      Out.print("<P class=\"Mensaje\">"+Msg+"</P>");
    }
    catch (Exception e) {}
  }
  void PrintErr(String Err){
    try {
      Out.print("<P style=\"color:rgb(255,0,0)\">"+Err+"</P>");
    }
    catch (Exception e) {}
  }
  void PrintLnk(String Lnk){
    try {
      Out.println("<div class=\"map\">");
      Out.println("<p id=\"p1\"><a href=\""+Lnk+"\">"+Lnk+"</a>");
      Out.println("</div>");
    }
    catch (Exception e) {}
  }
%>

Out es una variable que es útil solo para el script JSP no para el script PHP, no confundir con out. Out Nos sirve para imprimir desde un método externo al script JSP en uso.
La función GetNameScript nos permite obtener solo el nombre de nuestro Script (el que se está ejecutando).
La función GetPathScript permite obtener la ruta de la ubicación de nuestro Script, sin incluir el nombre del servidor, ni el nombre del Script.
GetStringProtocol es una función que permite saber el protocolo, en este caso http, que usamos al desplegar nuestro script.
GetStringPort Nos retorna como una cadena el puerto usado, en caso de que no sea 80, no sería necesario cambiar nuestro script.
PrintMsg Imprime la cadena de texto según el formato asignado a los mensajes, según CSS.
PrintErr Imprime la cadena de texto según el formato para los mensajes de error.
PrintLnk Imprime un vínculo, con formato de presentación definido en CSS.

Script PHP (Personal.php)
De igual manera se hizo para el respectivo script en PHP, recordemos además que es solo necesario importar el archivo RTF.php.

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

Y las mismas funciones descritas anteriormente.

<?php
  function GetNameScript($Script){
    return substr($Script,strripos($Script,"/")+1,strlen($Script));
  }
  function GetPathScript($Script){
    return substr($Script,0,strripos($Script,"/")+1);
  }
  function GetStringProtocol($Protocol){
    if ($Protocol=="HTTP/1.1") return "http://";
    return $Protocol;
  }
  function GetStringPort($Port){
    if ($Port == 80) return "";
    return ":".$Port;
  }
  function PrintMsg($Msg){
    print("<P class=\"Mensaje\">".$Msg."</P>");
  }
  function PrintErr($Err){
    print("<P style=\"color:rgb(255,0,0)\">".$Err."</P>");
  }
  function PrintLnk($Lnk){
    print("<div class=\"map\">");
    print("<p id=\"p1\"><a href=\"".$Lnk."\">".$Lnk."</a>");
    print("</div>");
  }
?>

Con estas definiciones de funciones se harán unos pequeños cambios en lo que respecta al código HTML de la entrada anterior referente a este tema que hemos incluido en dos archivos para separar el código HTML de los respectivos scripts JSP y PHP. Para el script Personal.php el contenido referente al Tag Head HTML lo hemos incluido en un archivo llamado TagHead.php cuyo contenido es:

  <head>
    <title>Registros - <?php print(GetNameScript($_SERVER['SCRIPT_NAME'])); ?></title>
    <!--
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    -->
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <link rel="stylesheet" href="Personal.css" type="text/css" />
    <link rel="shortcut icon" href="BZ.ico" type="image/x-icon" />
  </head>

Script JSP
Para el script Personal.jsp el contenido referente al Tag Head HTML se incluyó en el script TagHead.jsp cuyo contenido es:

  <head>
    <title>Registros - <%=GetNameScript(request.getServletPath())%></title>
    <!--
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    -->
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <link rel="stylesheet" href="Personal.css" type="text/css" />
    <link rel="shortcut icon" href="BZ.ico" type="image/x-icon" />
  </head>

También el código HTML referente al formulario se incluyó en un archivo llamado TagForm.jsp, podemos ver que se puede intercambiar de script en ejecución, para lo cual se ha incluido los botones que lo permiten, el código es el siguiente:

    <form method="post" name="FormOperar" enctype="multipart/form-data">
      <TABLE>
        <TR>
          <TH colspan="2">Datos Registros</TH>
        <TR>
          <TD colspan="2"><label for="Nombre">Nombres y Apellidos:</label><input type="text" id ="Nombre" name="tNombre" value="" size="30" class="Texto" />
        <TR>
          <TD><label for="Salario">Valor Salario:</label><input type="text" id="Salario" name="tSalario" value="" size="11" class="Texto" />
          <TD><label for="Ingreso">Fecha Ingreso:</label><input type="text" id="Ingreso" name="tIngreso" value="" size="10" class="Texto" />
        <TR>
          <TD colspan="2"><label for="Foto">Foto Reciente:</label><input type="file" id="Foto" name="fFoto" size="60" class="File" />
        <TR>
          <TD colspan="2"><label for="Resumen">Resumen:</label><input type="file" id="Resumen" name="fResumen" size="60" class="File" />
      </TABLE>
      <TABLE>
        <TR>
          <TH>Personal.jsp</TH>
          <TD><input type="submit" name="bCargar" value="Cargar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bListar" value="Listar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bBorrar" value="Borrar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bReset" value="Inicio HTML" onClick="document.FormOperar.action='Personal.html'" class="Boton" />
        </TR>
        <TR>
          <TH>Personal.php</TH>
          <TD><input type="submit" name="bCargar" value="Cargar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bListar" value="Listar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bBorrar" value="Borrar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bReset" value="Inicio PHP" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
      </TABLE>
    </form>

Script PHP
El código HTML referente al formulario se incluyó en un archivo llamado TagForm.php con código:

    <form method="post" name="FormOperar" enctype="multipart/form-data">
      <TABLE>
        <TR>
          <TH colspan="2">Datos Registros</TH>
        <TR>
          <TD colspan="2"><label for="Nombre">Nombres y Apellidos:</label><input type="text" id ="Nombre" name="tNombre" value="" size="30" class="Texto" />
        <TR>
          <TD><label for="Salario">Valor Salario:</label><input type="text" id="Salario" name="tSalario" value="" size="11" class="Texto" />
          <TD><label for="Ingreso">Fecha Ingreso:</label><input type="text" id="Ingreso" name="tIngreso" value="" size="10" class="Texto" />
        <TR>
          <TD colspan="2"><label for="Foto">Foto Reciente:</label><input type="file" id="Foto" name="fFoto" size="60" class="File" />
        <TR>
          <TD colspan="2"><label for="Resumen">Resumen:</label><input type="file" id="Resumen" name="fResumen" size="60" class="File" />
      </TABLE>
      <TABLE>
        <TR>
          <TH>Personal.jsp</TH>
          <TD><input type="submit" name="bCargar" value="Cargar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bListar" value="Listar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bBorrar" value="Borrar Datos" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
          <TD><input type="submit" name="bReset" value="Inicio JSP" onClick="document.FormOperar.action='Personal.jsp'" class="Boton" />
        </TR>
        <TR>
          <TH>Personal.php</TH>
          <TD><input type="submit" name="bCargar" value="Cargar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bListar" value="Listar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bBorrar" value="Borrar Datos" onClick="document.FormOperar.action='Personal.php'" class="Boton" />
          <TD><input type="submit" name="bReset" value="Inicio HTML" onClick="document.FormOperar.action='Personal.html'" class="Boton" />
      </TABLE>
    </form>

Los archivos TagHead.php y TagForm.jsp se incluyeron en un solo archivo llamado HTMLHead.php quedando así:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html>
  <?php include("TagHead.php"); ?>
  <body>
    <?php include("TagForm.php"); ?>

Este archivo se usa en conjunto con el archivo HTMLFoot.php cuyo contenido es:

  </body>
</html>

Script JSP
De igual manera se creó un archivo llamado HTMLHead.jsp que incluye los archivos TagHead.jsp y TagForm.jsp y su código es:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html>
  <%@ include file="TagHead.jsp" %>
  <body>
    <%@ include file="TagForm.jsp" %>

Similarmente como sucede con el código php este archivo se usa en conjunto con HTMLFoot.jsp y su código es:

  </body>
</html>

Script JSP (Personal.jsp)
Como podemos ver el código HTML se ha reducido a una línea en comparación a la manera anterior.
Ahora explicaré las variables encargadas de determinar la ruta de lectura de archivos y escritura de los mismos, adicionalmente construir su url para que se puedan descargar.

<%@ include file="HTMLHead.jsp" %>
    <%
      Out = out;

      String WebPath = GetPathScript(request.getServletPath());
      String WebRoot = GetStringProtocol(request.getProtocol())+request.getServerName()+GetStringPort(request.getServerPort())+WebPath;
      String FS = System.getProperty("file.separator");//Separador de Archivo o de Directorio
      //Buscar ruta del Script
      String ScriptRoot = application.getRealPath("")+WebPath;
      ScriptRoot = ScriptRoot.replace("\\",FS);//Reemplaza \ por FS
      ScriptRoot = ScriptRoot.replace("/",FS);//Reemplaza / por FS

Out Inicializamos la variable para poder usar el método de impresión (válido solo para JSP).
WebPath Almacena la ruta del script, sin incluir el nombre mismo del Script.
WebRoot Variable que crea una URL base teniendo en cuenta protocolo, nombre del servidor, puerto y la ruta donde se almacena el Script.
FS Almacena el separador de Archivo o de Directorio.
ScriptRoot Almacena la ruta de nuestro Script según el sistema de archivo del sistema operativo, éste se actualiza según la variable FS, para garantizar que nuestro script sea compatible con nuestro sistema operativo (Linux o Windows).

Script PHP (Personal.php)

<?php include("HTMLHead.php"); ?>
    <?php

      $WebPath = GetPathScript($_SERVER['SCRIPT_NAME']);
      $WebRoot = GetStringProtocol($_SERVER['SERVER_PROTOCOL']).$_SERVER['SERVER_NAME'].GetStringPort($_SERVER['SERVER_PORT']).$WebPath;
      $FS = DIRECTORY_SEPARATOR;//Separador de Archivo o de Directorio
      //Buscar ruta del Script
      $ScriptRoot = getenv("DOCUMENT_ROOT").$WebPath;
      $ScriptRoot = str_replace("/",$FS,$ScriptRoot);//Reemplaza / por $FS
      $ScriptRoot = str_replace("\\",$FS,$ScriptRoot);//Reemplaza \ por $FS

La conexión a MySQL se hace de la misma manera en que se explicó en la entrada anterior. Solo que para imprimir mensajes de resultado, mensajes de error se usan los métodos respectivos anteriormente explicados.

      //Conexión MySQL
      $host = "localhost";
      $User = "elusuario";
      $Pass = "laclave";
      $DB = "Empresa";
      $Enlace = new mysqli($host,$User,$Pass,$DB);
      if ($Enlace->connect_error) {
        PrintErr(sprintf("Connect Error: (%d) %s",$Enlace->connect_errno,$Enlace->connect_error));
        exit();
      }

      //Inserción
      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 {
          PrintErr(sprintf("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, utf8_encode (fread($fiResumen, 8192)));
            }
            fclose($fiResumen);
          }
        } else {
          PrintErr(sprintf("Error Upload File: (%d) %s",$HTTP_POST_FILES['fResumen']['error'],$Enlace->error));
          exit();
        }

        if ($Enunciado->execute()) {
          PrintMsg("Inserción Exitosa!<br/>");
        }else {
          PrintErr(sprintf("Error: (%d) %s",$Enlace->errno,$Enlace->error));
          exit();
        }
        $Enunciado->close();
        $Enlace->close();
      }

Script JSP (Personal.jsp)
De igual manera no hay cambios para el código JSP, solo los ya indicados en cuanto a los mensajes.

      if(ServletFileUpload.isMultipartContent(request)) {
        //Cargar Parámetros del Script
        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){ PrintErr(e.toString()); }

        //Conexión MySQL
        String host = "localhost";
        String User = "elusuario";
        String Pass = "laclave";
        String DB = "Empresa";
        try { Class.forName("com.mysql.jdbc.Driver"); }
        catch (ClassNotFoundException e) { PrintErr(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) { PrintErr(e.toString()); }

        //Inserción
        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();
            PrintMsg("Inserción Exitosa!<br/>");
          }
          catch (SQLException e) { PrintErr(e.toString()); }
          catch (Exception e) { PrintErr(e.toString()); }
          finally {
            PE.close();
            Conexion.close();
          }
        }

Script PHP (Personal.php)

      //Extracción
      if (isset($_POST['bListar'])){
        $FileName = "PHP.Personal.RTF";
        $FullFileName = $ScriptRoot.$FileName;
        $WebFileName = $WebRoot.$FileName;
        $ImageJPG = $ScriptRoot.$FS."joseluisbz.jpg";
        $ImagePNG = $ScriptRoot.$FS."Empresa.png";
        $fw = fopen($FullFileName, "wb");
        if($fw){
          $FileRTF = new RTFFile();
          $iFormato = NULL;
          $iAlto = NULL;
          $iAncho = NULL;
          $ImageRTFJPG = new RTFImage($ImageJPG,$iFormato,$iAlto,$iAncho);
          if (strcmp($ImageRTFJPG->GetHexImage(),"Error")==0){
            PrintErr("Error: el Archivo ".$ImageJPG." no es PNG o JPG");
            exit();
          }
          $InfImagenJPG = $ImageRTFJPG->GetImage($ImageRTFJPG->GetHexImage(),$iFormato,$iAlto,$iAncho,100,100,$iAlto*10,$iAncho*10,0,0,0,0);

          $ImageRTFPNG = new RTFImage($ImagePNG,$iFormato,$iAlto,$iAncho);
          if (strcmp($ImageRTFPNG->GetHexImage(),"Error")==0){
            PrintErr("Error: el Archivo ".$ImagePNG." no es PNG o JPG");
            exit();
          }
          $InfImagenPNG = $ImageRTFPNG->GetImage($ImageRTFPNG->GetHexImage(),$iFormato,$iAlto,$iAncho,100,100,$iAlto*10,$iAncho*10,0,0,0,0);
          $ImageRTFIMG = NULL;
          $InfImagenIMG = NULL;
          if ($Enunciado = $Enlace->prepare("SELECT * FROM Registros")) {
            $Enunciado->execute();
            $Enunciado->bind_result($sNombre,$sSalario,$sIngreso,$BytesFoto,$BytesResumen);
            $Enunciado->store_result();
            $NumRegistros = $Enunciado->num_rows;
            $TablaDatos = NULL;
            while ($Enunciado->fetch()) {
              $FileRTF->SetBasicFormatTextFile(1,3,2,5,20);
              $FileRTF->SetOtherFormatTextFile(0,0,1);
              $FileRTF->AddText("Empresa Limitada");
              $FileRTF->InsertParg();
              $TablaDatos = new RTFTable(4,4);//4 Columnas, 4 Filas
              $TablaDatos->SetFormatTable(10,10,1,1,10,2);
              $TablaDatos->SetFormatCellsTable(0,2,10,2);
              $TablaDatos->SetWideColsTable(2000);//Columnas ancho 2000
              $TablaDatos->SetWideColTable(1,3000);//Columna 1 ancho 3000
              $TablaDatos->SetBasicFormatTextTable(1,0,0,0,12);//Formato de Texto Tabla
              $TablaDatos->SetBasicFormatTextCell(0,0,1,0,0,0,12);//Formato Texto Celda 0,0
              $TablaDatos->SetTextCell(0,1,$InfImagenPNG);
              $TablaDatos->SetTextCell(3,1,$InfImagenJPG);
              $TablaDatos->SetMergeHorzCell(1,0,1);//Mezclar Celda 1,0 Inicio = 1
              $TablaDatos->SetMergeHorzCell(2,0,2);//Mezclar Celda 2,0 Continua = 2
              $TablaDatos->SetTextCell(1,0,"Celda 1,0 con Celda 2,0");
              $TablaDatos->SetMergeHorzCell(1,3,1);//Mezclar Celda 1,3 Inicio = 1
              $TablaDatos->SetMergeHorzCell(2,3,2);//Mezclar Celda 2,3 Continua = 2
              $TablaDatos->SetTextCell(1,3,"Celda 1,3 con Celda 2,3");
              $TablaDatos->SetMergeVertCell(0,1,1);//Mezclar Celda 0,1 Inicio = 1
              $TablaDatos->SetMergeVertCell(0,2,2);//Mezclar Celda 0,2 Continua = 2
              $TablaDatos->SetMergeVertCell(3,1,1);//Mezclar Celda 3,1 Inicio = 1
              $TablaDatos->SetMergeVertCell(3,2,2);//Mezclar Celda 3,2 Continua = 2
              $FileRTF->AddElement($TablaDatos->GetTable());
              $FileRTF->InsertLine();
              $FileRTF->InsertLine();
              $FileRTF->SetBasicFormatTextFile(2,4,2,4,12);
              $FileRTF->SetOtherFormatTextFile(0,0,1);
              $FileRTF->AddText("Nombre: ");
              $FileRTF->SetOtherFormatTextFile(0,1,0);
              $FileRTF->AddText(utf8_decode($sNombre));
              $FileRTF->InsertLine();
              $FileRTF->SetOtherFormatTextFile(0,0,1);
              $FileRTF->AddText("Salario: ");
              $FileRTF->SetOtherFormatTextFile(0,1,0);
              $FileRTF->AddText($sSalario);
              $FileRTF->InsertLine();
              $ImageRTFIMG = new RTFImage($BytesFoto,$iFormato,$iAlto,$iAncho);
              $InfImagenIMG = $ImageRTFIMG->GetImage($ImageRTFIMG->GetHexImage(),$iFormato,$iAlto,$iAncho,100,100,$iAlto*10,$iAncho*10,0,0,0,0);
              $FileRTF->AddElement($InfImagenIMG);
              $FileRTF->InsertParg();//Separe Image of Text
              $FileRTF->SetOtherFormatTextFile(0,0,1);
              $FileRTF->AddText("Resumen: ");
              $FileRTF->SetOtherFormatTextFile(0,1,0);
              $FileRTF->AddText(utf8_decode($BytesResumen));
              $NumRegistros--;
              if($NumRegistros>0){
                $FileRTF->InsertPage();//Nueva Página
              }
            }
            $Enunciado->close();
          }
          $FileRTF->CloseFile();
          fwrite($fw,$FileRTF->GetFile());
          fclose($fw);
          PrintLnk($WebFileName);
          PrintMsg("Generación de Archivo RTF Exitoso!<br/>");
        } else {
          PrintErr($FullFileName." (El sistema no puede encontrar la ruta especificada)");
          exit();
        }
      }

Script JSP (Personal.jsp)

        //Extracción
        if((String)Parameters.get("bListar")!=null){
          String FileName = "JSP.Personal.RTF";
          String FullFileName = ScriptRoot+FileName;
          String WebFileName = WebRoot+FileName;
          String ImageJPG = ScriptRoot+FS+"joseluisbz.jpg";
          String ImagePNG = ScriptRoot+FS+"Empresa.png";
          try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(FullFileName));
            RTFFile FileRTF = new RTFFile();
            int[] iFormato = new int[1];
            int[] iAlto = new int[1];
            int[] iAncho = new int[1];
            RTFImage ImageRTFJPG = new RTFImage(ImageJPG,iFormato,iAlto,iAncho);
            if (ImageRTFJPG.GetHexImage().equals("Error")){
              PrintErr("Error: el Archivo "+ImageJPG+" no es PNG o JPG");
              System.exit(0);
            }
            String InfImagenJPG = ImageRTFJPG.GetImage(ImageRTFJPG.GetHexImage(),iFormato[0],iAlto[0],iAncho[0],100,100,iAlto[0]*10,iAncho[0]*10,0,0,0,0);

            RTFImage ImageRTFPNG = new RTFImage(ImagePNG,iFormato,iAlto,iAncho);
            if (ImageRTFPNG.GetHexImage().equals("Error")){
              PrintErr("Error: el Archivo "+ImagePNG+" no es PNG o JPG");
              System.exit(0);
            }
            String InfImagenPNG = ImageRTFPNG.GetImage(ImageRTFPNG.GetHexImage(),iFormato[0],iAlto[0],iAncho[0],100,100,iAlto[0]*10,iAncho[0]*10,0,0,0,0);
            RTFImage ImageRTFIMG;
            String InfImagenIMG;
            PE = Conexion.prepareStatement("SELECT * FROM Registros");
            Resultado = PE.executeQuery();
            Resultado.last();
            int NumRegistros = Resultado.getRow();Resultado.beforeFirst();
            RTFTable TablaDatos;
            while(Resultado.next()){
              FileRTF.SetBasicFormatTextFile(1,3,2,5,20);
              FileRTF.SetOtherFormatTextFile(0,0,1);
              FileRTF.AddText("Empresa Limitada");
              FileRTF.InsertParg();
              TablaDatos = new RTFTable(4,4);//4 Columnas, 4 Filas
              TablaDatos.SetFormatTable(10,10,1,1,10,2);
              TablaDatos.SetFormatCellsTable(0,2,10,2);
              TablaDatos.SetWideColsTable(2000);//Columnas ancho 2000
              TablaDatos.SetWideColTable(1,3000);//Columna 1 ancho 3000
              TablaDatos.SetBasicFormatTextTable(1,0,0,0,12);//Formato de Texto Tabla
              TablaDatos.SetBasicFormatTextCell(0,0,1,0,0,0,12);//Formato Texto Celda 0,0
              TablaDatos.SetTextCell(0,1,InfImagenPNG);
              TablaDatos.SetTextCell(3,1,InfImagenJPG);
              TablaDatos.SetMergeHorzCell(1,0,1);//Mezclar Celda 1,0 Inicio = 1
              TablaDatos.SetMergeHorzCell(2,0,2);//Mezclar Celda 2,0 Continua = 2
              TablaDatos.SetTextCell(1,0,"Celda 1,0 con Celda 2,0");
              TablaDatos.SetMergeHorzCell(1,3,1);//Mezclar Celda 1,3 Inicio = 1
              TablaDatos.SetMergeHorzCell(2,3,2);//Mezclar Celda 2,3 Continua = 2
              TablaDatos.SetTextCell(1,3,"Celda 1,3 con Celda 2,3");
              TablaDatos.SetMergeVertCell(0,1,1);//Mezclar Celda 0,1 Inicio = 1
              TablaDatos.SetMergeVertCell(0,2,2);//Mezclar Celda 0,2 Continua = 2
              TablaDatos.SetMergeVertCell(3,1,1);//Mezclar Celda 3,1 Inicio = 1
              TablaDatos.SetMergeVertCell(3,2,2);//Mezclar Celda 3,2 Continua = 2
              FileRTF.AddElement(TablaDatos.GetTable());
              FileRTF.InsertLine();
              FileRTF.InsertLine();
              FileRTF.SetBasicFormatTextFile(2,4,2,4,12);
              FileRTF.SetOtherFormatTextFile(0,0,1);
              FileRTF.AddText("Nombre: ");
              FileRTF.SetOtherFormatTextFile(0,1,0);
              FileRTF.AddText(Resultado.getString(1));
              FileRTF.InsertLine();
              FileRTF.SetOtherFormatTextFile(0,0,1);
              FileRTF.AddText("Salario: ");
              FileRTF.SetOtherFormatTextFile(0,1,0);
              FileRTF.AddText(String.valueOf(Resultado.getInt(2)));
              FileRTF.InsertLine();
              ImageRTFIMG = new RTFImage(Resultado.getBytes(4),iFormato,iAlto,iAncho);
              InfImagenIMG = ImageRTFIMG.GetImage(ImageRTFIMG.GetHexImage(),iFormato[0],iAlto[0],iAncho[0],100,100,iAlto[0]*10,iAncho[0]*10,0,0,0,0);
              FileRTF.AddElement(InfImagenIMG);
              FileRTF.InsertParg();//Separe Image of Text
              FileRTF.SetOtherFormatTextFile(0,0,1);
              FileRTF.AddText("Resumen: ");
              FileRTF.SetOtherFormatTextFile(0,1,0);
              FileRTF.AddText(Resultado.getString(5));
              NumRegistros--;
              if (NumRegistros>0){
                FileRTF.InsertPage();//Nueva Página
              }
            }
            FileRTF.CloseFile();
            bw.write(FileRTF.GetFile());
            bw.close();
            PrintLnk(WebFileName);
            PrintMsg("Generación de Archivo RTF Exitoso!<br/>");
          }
          catch (Exception e) { PrintErr(e.toString()); }
        }

Script PHP (Personal.php)

      //Eliminación
      if (isset($_POST['bBorrar'])){
        $Consulta = "DELETE FROM Registros";
        $Resultado = $Enlace->query($Consulta);
        if (!$Resultado) {
          PrintErr(sprintf("Error: (%d) %s",$Enlace->errno,$Enlace->error));
          exit();
        }
        PrintMsg("Eliminación Exitosa!<br/>");
      }

Finalizamos el script PHP con:

    ?>
<?php include("HTMLFoot.php"); ?>

Script JSP (Personal.jsp)

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

Finalizamos el script JSP el siguiente código:

      }
    %>
<%@ include file="HTMLFoot.jsp" %>

La llave de cierre coincide con la llave de apertura de la sentencia if del objeto ServletFileUpload.

Resultados
Veamos algunos resultados:
Previamente se había cargado un registro de prueba con caracteres especiales y al presionar el botón “Listar Datos” en ambos scripts se obtienen los siguientes pantallazos.


Podemos ver el pantallazo del archivo RTF generado por los dos scripts, si se compara de manera binaria el contenido del JSP.Personal.RTF y del archivo PHP.Personal.RTF son exactamente iguales.

Para ver como se muestran los errores se presióno el botón “Cargar Datos” con el formulario vacío:

Por último se presionó el botón “Borrar Datos” y se obtuvieron los siguientes pantallazos.

Para obtener los códigos y probar estos ejemplos dejo los enlaces: Personal.zip

Anuncios

Acerca de joseluisbz

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

6 respuestas a Subiendo Imágenes (PNG y JPG) y Archivos a MySQL con PHP y JSP y mostrarlos en RTF usando clases

  1. Gustavo P. dijo:

    Muchas gracias por tus aportes muy intersentes y bien documentados.
    Tengo la aplicacion en JSP y cuando lleno el formulario y le doy la opcion de GUARDAR DATOS
    me aparece el siguiente mensaje..
    La excepci?n causante del error ha sido: java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream at

    Por favor si me puedes ayudar y gracias de antemano

  2. Gustavo P. dijo:

    Gracias por tu respuesta tan inmediata
    1.- Si efectivamente uno de los archivos .jar que tenia era una version mas antigua; ahora ya me guarda los datos;

    2.- “Listar Datos” me genera el link pero no encuentra el reporte..
    Nuevamente gracias por tu apoyo

    http://localhost:24123/JSP.Personal.RTF
    Generación de Archivo RTF Exitoso!

  3. Gustavo P. dijo:

    Te comento:
    1. El reporte JSP.Personal.RTF puedo verlo en el folder web de mi proyecto
    2. Mi entorno es :
    Windowns 7
    NetBeans 7.2.1
    GlassFish 3.1
    JDK 6
    3.,Disculpa los inconvenientes ; no se si alcanzo responder tu pregunta y gracias por tu atencion.

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