Cómo Grabar Archivos desde una Aplicación de Usuario en el Servidor tomcat




En ocasiones, es necesario grabar un archivo desde la aplicación del usuario en el servidor. Esto puede incluir imágenes, archivos HTML, documentos DOCX o hojas de cálculo Excel. Es útil poder almacenarlos en un lugar desde el cual podamos acceder para descargarlos o desplegarlos más tarde.


Pasos Esenciales

  1. Crear una Carpeta para Almacenar Archivos

    • Crea una carpeta en el servidor que pueda ser accedida mediante el frontend.
    • Dale permisos de lectura, escritura y ejecución para asegurar que la aplicación pueda interactuar con ella adecuadamente.
  2. Configurar el Archivo context.xml

    • Ubica el archivo context.xml en la carpeta META-INF de tu aplicación (/webapps/gestionadmon/META-INF/context.xml).
    • Asegúrate de configurarlo para permitir el acceso dinámico al punto de grabación del archivo.
<Context cachingAllowed="true" crossContext="true">
    <Resources>
        <PreResources className="org.apache.catalina.webresources.DirResourceSet"
                      base="${catalina.base}/webapps/gestionadmon/archivos_html"
                      webAppMount="/archivos_html"
                      readOnly="true" />
    </Resources>
</Context>

Configurar el web.xml

  • Configura el archivo web.xml para mapear el servlet  y el uso de CORS que manejará la escritura de archivos esrto ayuda a el uso de CORS para el manejo de peticiones desde otros servidores
<servlet>
<servlet-name>EscribirArchivo</servlet-name>
        <servlet-class>dwr.gestion.EscribirArchivo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>EscribirArchivo</servlet-name>
        <url-pattern>/EscribirArchivo</url-pattern>
    </servlet-mapping>

    <filter>
      <filter-name>CORS</filter-name>
      <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
      <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
      </init-param>
      <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
      </init-param>
      <init-param>
<param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,Accept,X-Requested-With</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>CORS</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

Crear el Servlet para Almacenar Archivos

  • Crea una clase servlet en la carpeta WEB-INF/classes de tu aplicación que se encargue de escribir los archivos en el servidor.
package com.tuprojecto;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EscribirArchivo extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// cabeceras par el manejo referencias cruzadas CORS

response.setHeader("Access-Control-Allow-Origin", "*"); 
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); resonse.setHeader("Access-Control-Max-Age", "3600"); 
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); 
response respuesta.setHeader("Referrer-Policy", "unsafe-url");

        ServletContext context = getServletContext();
        String realPath = context.getRealPath("/archivos_html");

        File directory = new File(realPath);
        if (!directory.exists()) {
            directory.mkdirs();
        }

        String nombreDelArchivo = request.getParameter("nombreDelArchivo");
        String contenidoHtml = request.getParameter("contenidoHtml");

        File file = new File(directory, nombreDelArchivo);
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(contenidoHtml);
        }

        response.getWriter().write("Archivo guardado correctamente.");
    }

protected void doOptions(HttpServletRequest entrada, HttpServletResponse respuesta) throws ServletException, IOException { 
  // Añadir cabeceras CORS 
 response.setHeader("Access-Control-Allow-Origin", "*"); 
 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");   response.setHeader("Access-Control-Max-Age", "3600"); 
 responsesetHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); }

}

Permisos de la Carpeta

  • Asegúrate de que la carpeta archivos_html tiene los permisos adecuados.

En Linux/Unix:


sudo chown -R tomcat:tomcat /path/to/archivos_html
sudo chmod -R 755 /path/to/archivos_html

Crear el Script JavaScript

  • Crea un script JavaScript que permita capturar el archivo y enviarlo al servidor.
  • Es importante indiar el puerto por que esta recibiendo la llamada del sitio que
  • invoca el serverlet aunque tenga https e indispensable indicar el puerto en este caso 443 o 8443 según el caso
<script>

function EnviarArchivo(nombreArchivo, contenidoHtml) {
    fetch('https://suSitio.com;443/gestionadmon/EscribirArchivo', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: 'nombreDelArchivo=' + encodeURIComponent(nombreArchivo) + '&contenidoHtml=' + encodeURIComponent(contenidoHtml)
    })
    .then(response => response.text())
    .then(data => {
        console.log(data); // Maneja la respuesta del servlet
    })
    .catch(error => {
        console.error('Error:', error);
    });
}

</script>

Conclusión

Siguiendo estos pasos, puedes configurar tu servidor Tomcat para permitir que una aplicación web grabe archivos en el servidor de manera segura y eficiente. Esta configuración es útil para almacenar archivos que pueden ser descargados o desplegados más tarde, mejorando la funcionalidad y usabilidad de tu aplicación.

Comentarios

Entradas populares