Implémentation de l'Upload de Fichiers avec Apache Struts 2

L'implémentation du téléchargement de fichiers (upload) dans une application web basée sur Apache Struts 2 repoce principalement sur l'intercepteur fileUpload. Par défaut, le framework impose une restriction stricte sur la taille des fichiers transférés. Si aucune configuration explicite n'est définie, la taille maximale autorisée pour une requête multipart est de 2 Mo (2 097 152 octets).

Pour gérer des documents plus volumineux et restreindre les types de fichiers acceptés, il est nécessaire d'ajuster les paramètres dans le fichier de configuration struts.xml et de configurer correctement l'intercepteur au niveau de l'action.

Configuraton des Limites de Taille et des Types MIME

La propriété globale struts.multipart.maxSize définit la taille maximale totale pour une requête multipart. Pour les restrictions spécifiques à un fichier individuel, telles que le type MIME et la taille maximale par fichier, on configure l'intercepteur fileUpload directement dans la déclaration de l'action.

Implémentation du Contrôleur (Action)

Le contrôleur ci-dessous utilise l'API NIO de Java pour copier le fichier temporaire généré par le framework Struts vers le répertoire de destination final sur le serveur.

package com.tech.actions;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

import com.opensymphony.xwork2.ActionSupport;

public class DocumentUploadController extends ActionSupport {
    
    private File uploadedDocument;
    private String documentName;
    private String documentMimeType;

    public File getUploadedDocument() { 
        return uploadedDocument; 
    }
    
    public void setUploadedDocument(File uploadedDocument) { 
        this.uploadedDocument = uploadedDocument; 
    }

    public String getDocumentName() { 
        return documentName; 
    }
    
    public void setDocumentName(String documentName) { 
        this.documentName = documentName; 
    }

    public String getDocumentMimeType() { 
        return documentMimeType; 
    }
    
    public void setDocumentMimeType(String documentMimeType) { 
        this.documentMimeType = documentMimeType; 
    }

    @Override
    public String execute() throws IOException {
        if (uploadedDocument != null && documentName != null) {
            Path targetDirectory = Paths.get("C:/temp/uploads");
            Files.createDirectories(targetDirectory);
            
            Path targetPath = targetDirectory.resolve(documentName);
            Files.copy(uploadedDocument.toPath(), targetPath, StandardCopyOption.REPLACE_EXISTING);
            
            return SUCCESS;
        }
        return ERROR;
    }
}

Configuration Struts (struts.xml)

Dans ce fichier de configuration, nous définissons une limite globale de 15 Mo pour les requêtes multipart, tout en restreignant l'action spécifique à des fichiers de 5 Mo maximum, en autorisant uniquement certains formats d'images et les documents PDF.

<?xml version="1.0" encoding="UTF-8" ?>


<struts>
    <!-- Limite globale de la taille des requêtes multipart à 15 Mo -->
    <constant name="struts.multipart.maxSize" value="15728640" />

    <package name="document_management" extends="struts-default">
        
        <action name="uploadDocument" class="com.tech.actions.DocumentUploadController">
            <result name="input">uploadForm.jsp</result>
            <result name="success">uploadSuccess.jsp</result>
            <result name="error">uploadForm.jsp</result>
            
            <interceptor-ref name="fileUpload">
                <!-- Autoriser uniquement les images et les PDFs -->
                <param name="allowedTypes">image/png,image/jpeg,image/gif,application/pdf</param>
                <!-- Limite de taille par fichier à 5 Mo -->
                <param name="maximumSize">5242880</param>
            </interceptor-ref>
            
            <interceptor-ref name="defaultStack" />
        </action>
        
    </package>
</struts>

Interface Utilisateur (JSP)

La page JSP utilise les balises Struts pour générer le formulaire. L'attribut enctype="multipart/form-data" est indispensable pour permettre le transfert binaire des fichiers.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head>
    <meta charset="UTF-8">
    <title>Formulaire de Téléchargement</title>
</head>
<body>
    <h2>Télécharger un Document</h2>
    
    <!-- Affichage des erreurs de validation -->
    <s:fielderror />
    
    <s:form action="uploadDocument" method="post" enctype="multipart/form-data">
        <s:file name="uploadedDocument" label="Sélectionner un fichier" />
        <s:submit value="Envoyer" />
    </s:form>
</body>
</html>

Page de Confrimation

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
<head>
    <meta charset="UTF-8">
    <title>Succès</title>
</head>
<body>
    <p>Le fichier a été téléchargé avec succès sur le serveur.</p>
</body>
</html>

En cas d'échec de la validation, comme une taille dépassée ou un type MIME non autorisé, l'intercepteur fileUpload ajoute automatiquement des messages d'erreur au champ correspondant. Ces erreurs sont ensuite affichées dans la vue via la balise <s:fielderror> avant que l'utilisateur ne soit redirigé vers le résultat input.

Étiquettes: apache-struts2 file-upload java-nio JSP struts-xml

Publié le 11 juillet à 07h41