Struts 2 - Téléchargement de fichiers

Le framework Struts 2 fournit une prise en charge intégrée pour le traitement du téléchargement de fichiers à l'aide de «Téléchargement de fichier basé sur un formulaire en HTML». Lorsqu'un fichier est téléchargé, il est généralement stocké dans un répertoire temporaire et doit être traité ou déplacé par votre classe Action vers un répertoire permanent pour garantir que les données ne sont pas perdues.

Note - Les serveurs peuvent avoir une politique de sécurité en place qui vous interdit d'écrire dans des répertoires autres que le répertoire temporaire et les répertoires appartenant à votre application Web.

Le téléchargement de fichiers dans Struts est possible via un intercepteur prédéfini appelé FileUpload intercepteur, disponible via la classe org.apache.struts2.interceptor.FileUploadInterceptor et inclus dans le cadre dedefaultStack. Vous pouvez toujours l'utiliser dans votre struts.xml pour définir divers paramètres comme nous le verrons ci-dessous.

Créer des fichiers de vue

Commençons par créer notre vue qui sera nécessaire pour parcourir et télécharger un fichier sélectionné. Alors créons unindex.jsp avec un formulaire de téléchargement HTML simple qui permet à l'utilisateur de télécharger un fichier -

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>File Upload</title>
   </head>
   
   <body>
      <form action = "upload" method = "post" enctype = "multipart/form-data">
         <label for = "myFile">Upload your file</label>
         <input type = "file" name = "myFile" />
         <input type = "submit" value = "Upload"/>
      </form>
   </body>
</html>

Il y a quelques points à noter dans l'exemple ci-dessus. Tout d'abord, le enctype du formulaire est défini surmultipart/form-data. Cela doit être défini pour que les téléchargements de fichiers soient gérés avec succès par l'intercepteur de téléchargement de fichiers. Le point suivant est la méthode d'action du formulaireupload et le nom du champ de téléchargement de fichier - qui est myFile. Nous avons besoin de ces informations pour créer la méthode d'action et la configuration des struts.

Ensuite, créons un simple fichier jsp success.jsp pour afficher le résultat de notre téléchargement de fichier au cas où il réussirait.

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

<html>
   <head>
      <title>File Upload Success</title>
   </head>
   
   <body>
      You have successfully uploaded <s:property value = "myFileFileName"/>
   </body>
</html>

Voici le fichier de résultat error.jsp au cas où il y aurait une erreur lors du téléchargement du fichier -

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

<html>
   <head>
      <title>File Upload Error</title>
   </head>
   
   <body>
      There has been an error in uploading the file.
   </body>
</html>

Créer une classe d'action

Ensuite, créons une classe Java appelée uploadFile.java qui se chargera de télécharger le fichier et de stocker ce fichier dans un emplacement sécurisé -

package com.tutorialspoint.struts2;

import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException; 

import com.opensymphony.xwork2.ActionSupport;

public class uploadFile extends ActionSupport {
   private File myFile;
   private String myFileContentType;
   private String myFileFileName;
   private String destPath;

   public String execute() {
      /* Copy file to a safe location */
      destPath = "C:/apache-tomcat-6.0.33/work/";

      try {
         System.out.println("Src File name: " + myFile);
         System.out.println("Dst File name: " + myFileFileName);
     	    	 
         File destFile  = new File(destPath, myFileFileName);
         FileUtils.copyFile(myFile, destFile);
  
      } catch(IOException e) {
         e.printStackTrace();
         return ERROR;
      }

      return SUCCESS;
   }
   
   public File getMyFile() {
      return myFile;
   }
   
   public void setMyFile(File myFile) {
      this.myFile = myFile;
   }
   
   public String getMyFileContentType() {
      return myFileContentType;
   }
   
   public void setMyFileContentType(String myFileContentType) {
      this.myFileContentType = myFileContentType;
   }
   
   public String getMyFileFileName() {
      return myFileFileName;
   }
   
   public void setMyFileFileName(String myFileFileName) {
      this.myFileFileName = myFileFileName;
   }
}

le uploadFile.javaest une classe très simple. La chose importante à noter est que l'intercepteur FileUpload avec l'intercepteur de paramètres fait tout le gros du travail pour nous.

L'intercepteur FileUpload met à votre disposition trois paramètres par défaut. Ils sont nommés dans le modèle suivant -

  • [your file name parameter] - Il s'agit du fichier réel que l'utilisateur a téléchargé. Dans cet exemple, ce sera "myFile"

  • [your file name parameter]ContentType- Il s'agit du type de contenu du fichier qui a été téléchargé. Dans cet exemple, ce sera "myFileContentType"

  • [your file name parameter]FileName- C'est le nom du fichier qui a été téléchargé. Dans cet exemple, ce sera "myFileFileName"

Les trois paramètres sont disponibles pour nous, grâce aux intercepteurs Struts. Tout ce que nous avons à faire est de créer trois paramètres avec les noms corrects dans notre classe Action et automatiquement ces variables sont automatiquement câblées pour nous. Ainsi, dans l'exemple ci-dessus, nous avons trois paramètres et une méthode d'action qui renvoie simplement «succès» si tout se passe bien, sinon elle renvoie «erreur».

Fichiers de configuration

Voici les propriétés de configuration Struts2 qui contrôlent le processus de téléchargement des fichiers -

Sr. Non Propriétés et description
1

struts.multipart.maxSize

La taille maximale (en octets) d'un fichier à accepter comme téléchargement de fichier. La valeur par défaut est 250M.

2

struts.multipart.parser

La bibliothèque utilisée pour télécharger le formulaire en plusieurs parties. Par défaut estjakarta

3

struts.multipart.saveDir

L'emplacement de stockage du fichier temporaire. Par défaut, javax.servlet.context.tempdir.

Pour modifier l'un de ces paramètres, vous pouvez utiliser constant tag dans le fichier struts.xml de votre application, comme je l'ai fait pour modifier la taille maximale d'un fichier à télécharger.

Laissez-nous notre struts.xml comme suit -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <constant name = "struts.multipart.maxSize" value = "1000000" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
         <result name = "success">/success.jsp</result>
         <result name = "error">/error.jsp</result>
      </action>
   </package>
</struts>

Depuis, FileUploadl'intercepteur fait partie de la pile d'intercepteurs par défaut, nous n'avons pas besoin de le configurer explicitement. Mais, vous pouvez ajouter la balise <interceptor-ref> dans <action>. L'intercepteur fileUpload prend deux paramètres(a) maximumSize et (b) allowedTypes.

Le paramètre maximumSize définit la taille de fichier maximale autorisée (la valeur par défaut est d'environ 2 Mo). Le paramètre allowedTypes est une liste séparée par des virgules des types de contenu accepté (MIME) comme indiqué ci-dessous -

<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
   <interceptor-ref name = "basicStack">
   <interceptor-ref name = "fileUpload">
      <param name = "allowedTypes">image/jpeg,image/gif</param>
   </interceptor-ref>
   <result name = "success">/success.jsp</result>
   <result name = "error">/error.jsp</result>
</action>

Voici le contenu de web.xml fichier -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Maintenant, faites un clic droit sur le nom du projet et cliquez sur Export > WAR Filepour créer un fichier War. Déployez ensuite ce WAR dans le répertoire webapps de Tomcat. Enfin, démarrez le serveur Tomcat et essayez d'accéder à l'URLhttp://localhost:8080/HelloWorldStruts2/upload.jsp. Cela produira l'écran suivant -

Sélectionnez maintenant un fichier "Contacts.txt" en utilisant le bouton Parcourir et cliquez sur le bouton de téléchargement qui téléchargera le fichier sur votre serveur et vous devriez voir la page suivante. Vous pouvez vérifier que le fichier téléchargé doit être enregistré dans C: \ apache-tomcat-6.0.33 \ work.

Notez que l'Intercepteur FileUpload supprime automatiquement le fichier téléchargé, vous devrez donc enregistrer le fichier téléchargé par programme à un endroit avant qu'il ne soit supprimé.

Messages d'erreur

L'intercepteur fileUplaod utilise plusieurs touches de message d'erreur par défaut -

Sr. Non Clé et description du message d'erreur
1

struts.messages.error.uploading

Erreur générale qui se produit lorsque le fichier n'a pas pu être téléchargé.

2

struts.messages.error.file.too.large

Se produit lorsque le fichier téléchargé est trop volumineux comme spécifié par maximumSize.

3

struts.messages.error.content.type.not.allowed

Se produit lorsque le fichier téléchargé ne correspond pas aux types de contenu attendus spécifiés.

Vous pouvez remplacer le texte de ces messages dans WebContent/WEB-INF/classes/messages.properties fichiers de ressources.