Implementación de Carga de Archivos en Struts 2

Para gestionar la carga de archivos en aplicaciones Struts 2, se requeiren las siguientes bibliotecas:

  • commons-fileupload-1.3.2.jar
  • commons-io-2.2.jar

Interfaz JSP para Carga de Archivos

La interfaz de usuario para la carga de archivos se define mediante el siguiente código JSP:


<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Carga de Archivos</title>
</head>
<body>
<form action="upload_process" method="post" enctype="multipart/form-data">
<input type="file" name="uploadedFile"><br><br>
<input type="submit" value="Subir Archivo">
</form>
</body>
</html>

Clase Action para Procesar la Carga

La clase Action debe incluir tres miembros para manejar el archivo cargado:

  1. File uploadedFile: Representa el archivo cargado.
  2. String uploadedFileFileName: El nombre original del archivo.
  3. String uploadedFileContentType: El tipo MIME del archivo.

La utilidad FileUtils.copyFile() de Apache Commons IO simplifica la copia del archivo.

Conifguración de Struts.xml

El archivo struts.xml permite configurar el límite de tamaño para la carga de archivos. Modificar la constante struts.multipart.maxSize permite la carga de archivos grandes.


<?xml version="1.0" encoding="UTF-8" ?>
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <constant name="struts.ui.theme" value="simple"></constant>
    <!-- Establece el tamaño máximo de carga de archivos (en bytes) -->
    <constant name="struts.multipart.maxSize" value="20971520" /> <!-- 20MB -->

    <package name="default" namespace="/" extends="struts-default">
         <!-- Mapeo genérico para acciones y resultados -->
         <action name="*_*" class="com.example.struts.controller.{1}Action" method="{2}">
            <result>
                {1}_{2}.jsp
            </result>
        </action>
    </package>

    <!-- Otros paquetes o inclusiones pueden ir aquí -->
</struts>

Gestión de Nombres de Archivo Duplicados

Para evitar conflictos por nombres de archivo idénticos, se puede prefijar el nombre del archivo con la marca de tiempo actual antes de guardarlo.


package com.example.struts.controller;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
    private File uploadedFile;
    private String uploadedFileFileName;
    private String uploadedFileContentType;

    // Getters y Setters para uploadedFile
    public File getUploadedFile() {
        return uploadedFile;
    }
    public void setUploadedFile(File uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    // Getters y Setters para uploadedFileFileName
    public String getUploadedFileFileName() {
        return uploadedFileFileName;
    }
    public void setUploadedFileFileName(String uploadedFileFileName) {
        this.uploadedFileFileName = uploadedFileFileName;
    }

    // Getters y Setters para uploadedFileContentType
    public String getUploadedFileContentType() {
        return uploadedFileContentType;
    }
    public void setUploadedFileContentType(String uploadedFileContentType) {
        this.uploadedFileContentType = uploadedFileContentType;
    }

    public String execute() {
        return SUCCESS; // Método por defecto para mostrar el formulario
    }

    public String process() throws IOException {
        // Generar un prefijo único basado en la fecha y hora actuales
        String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS").format(new Date());
        String newFileName = timestamp + "_" + uploadedFileFileName;

        // Definir la ruta de destino para guardar el archivo
        File destinationFile = new File("D:\\uploads\\" + newFileName); // Asegúrate de que el directorio exista

        // Copiar el archivo cargado al destino
        FileUtils.copyFile(uploadedFile, destinationFile);

        // Puedes agregar lógica adicional aquí, como guardar la información del archivo en la base de datos

        return SUCCESS;
    }
}

Carga Múltiple de Archivos

Para permitir la carga de varios archivos simultáneamante, los miembros de la clase Action deben definirse como arrays.


package com.example.struts.controller;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class MultiUploadAction extends ActionSupport {
    private File[] uploadedFiles;
    private String[] uploadedFilesFileName;
    private String[] uploadedFilesContentType;

    // Getters y Setters para uploadedFiles
    public File[] getUploadedFiles() {
        return uploadedFiles;
    }
    public void setUploadedFiles(File[] uploadedFiles) {
        this.uploadedFiles = uploadedFiles;
    }

    // Getters y Setters para uploadedFilesFileName
    public String[] getUploadedFilesFileName() {
        return uploadedFilesFileName;
    }
    public void setUploadedFilesFileName(String[] uploadedFilesFileName) {
        this.uploadedFilesFileName = uploadedFilesFileName;
    }

    // Getters y Setters para uploadedFilesContentType
    public String[] getUploadedFilesContentType() {
        return uploadedFilesContentType;
    }
    public void setUploadedFilesContentType(String[] uploadedFilesContentType) {
        this.uploadedFilesContentType = uploadedFilesContentType;
    }

    public String execute() {
        return SUCCESS; // Método por defecto para mostrar el formulario
    }

    public String processMultiple() throws IOException {
        if (uploadedFiles != null && uploadedFiles.length > 0) {
            for (int i = 0; i < uploadedFiles.length; i++) {
                File currentFile = uploadedFiles[i];
                if (currentFile != null) {
                    // Construir la ruta de destino
                    String destinationPath = "D:\\uploads\\" + uploadedFilesFileName[i];
                    File destinationFile = new File(destinationPath);
                    // Copiar el archivo
                    FileUtils.copyFile(currentFile, destinationFile);
                }
            }
        }
        return SUCCESS;
    }
}

Interfaz JSP para Carga Múltiple

La interfaz JSP para la carga múltiple de archivos se implementa de la siguiente manera, utilizando múltiples campos de tipo file con el mismo atributo name:


<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Carga Múltiple de Archivos</title>
</head>
<body>
<h1>Carga Múltiple de Archivos</h1>
<form action="multi_process" method="post" enctype="multipart/form-data">
Archivo 1: <input type="file" name="uploadedFiles"><br>
Archivo 2: <input type="file" name="uploadedFiles"><br>
Archivo 3: <input type="file" name="uploadedFiles"><br>
Archivo 4: <input type="file" name="uploadedFiles"><br>
Archivo 5: <input type="file" name="uploadedFiles"><br><br>
<input type="submit" value="Subir Archivos">
</form>
</body>
</html>

Etiquetas: struts2 fileupload java jsp Action

Publicado el 7-19 22:57