Struts 2 - Caricamento di file

Il framework Struts 2 fornisce il supporto integrato per l'elaborazione del caricamento di file utilizzando "Caricamento di file basato su modulo in HTML". Quando un file viene caricato, in genere viene archiviato in una directory temporanea e devono essere elaborati o spostati dalla classe Action in una directory permanente per garantire che i dati non vadano persi.

Note - I server potrebbero avere una politica di sicurezza che vieta di scrivere in directory diverse dalla directory temporanea e dalle directory che appartengono alla vostra applicazione web.

Il caricamento dei file in Struts è possibile tramite un intercettore predefinito chiamato FileUpload interceptor che è disponibile tramite la classe org.apache.struts2.interceptor.FileUploadInterceptor e incluso come parte delladefaultStack. Puoi comunque usarlo nel tuo struts.xml per impostare vari parametri come vedremo di seguito.

Crea file di visualizzazione

Cominciamo con la creazione della nostra vista che sarà richiesta per sfogliare e caricare un file selezionato. Quindi creiamo un fileindex.jsp con semplice modulo di caricamento HTML che consente all'utente di caricare un file -

<%@ 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>

Ci sono un paio di punti che vale la pena notare nell'esempio sopra. Innanzitutto, l'enctype del modulo è impostato sumultipart/form-data. Questo dovrebbe essere impostato in modo che i caricamenti di file siano gestiti correttamente dall'intercettatore di caricamento file. Il punto successivo da notare è il metodo di azione del moduloupload e il nome del campo di caricamento del file, che è myFile. Abbiamo bisogno di queste informazioni per creare il metodo di azione e la configurazione dei montanti.

Successivamente, creiamo un semplice file jsp success.jsp per visualizzare il risultato del nostro caricamento di file nel caso in cui abbia successo.

<%@ 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>

Di seguito sarà il file dei risultati error.jsp in caso di errore durante il caricamento del file -

<%@ 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>

Crea classe d'azione

Successivamente, creiamo una classe Java chiamata uploadFile.java che si occuperà del caricamento del file e dell'archiviazione del file in un luogo sicuro -

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;
   }
}

Il uploadFile.javaè una classe molto semplice. La cosa importante da notare è che l'interceptor FileUpload insieme a Parameters Interceptor fa tutto il lavoro pesante per noi.

L'intercettore FileUpload rende disponibili tre parametri per impostazione predefinita. Sono denominati nel seguente schema:

  • [your file name parameter] - Questo è il file effettivo che l'utente ha caricato. In questo esempio sarà "myFile"

  • [your file name parameter]ContentType- Questo è il tipo di contenuto del file che è stato caricato. In questo esempio sarà "myFileContentType"

  • [your file name parameter]FileName- Questo è il nome del file che è stato caricato. In questo esempio sarà "myFileFileName"

I tre parametri sono disponibili per noi, grazie agli Struts Interceptors. Tutto quello che dobbiamo fare è creare tre parametri con i nomi corretti nella nostra classe Action e automaticamente queste variabili vengono cablate automaticamente per noi. Quindi, nell'esempio sopra, abbiamo tre parametri e un metodo di azione che restituisce semplicemente "successo" se tutto va bene altrimenti restituisce "errore".

File di configurazione

Di seguito sono riportate le proprietà di configurazione di Struts2 che controllano il processo di caricamento dei file:

Suor n Proprietà e descrizione
1

struts.multipart.maxSize

La dimensione massima (in byte) di un file da accettare come caricamento di file. L'impostazione predefinita è 250 M.

2

struts.multipart.parser

La libreria utilizzata per caricare il modulo multiparte. Di default èjakarta

3

struts.multipart.saveDir

La posizione in cui archiviare il file temporaneo. Per impostazione predefinita è javax.servlet.context.tempdir.

Per modificare una qualsiasi di queste impostazioni, puoi utilizzare constant tag nel file struts.xml delle applicazioni, come ho fatto per modificare la dimensione massima di un file da caricare.

Facci avere il nostro struts.xml come segue -

<?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>

Da, FileUploadinterceptor fa parte dello Stack predefinito di interceptor, non è necessario configurarlo esplicitamente. Ma puoi aggiungere il tag <interceptor-ref> all'interno di <action>. L'interceptor fileUpload accetta due parametri(a) maximumSize e (b) allowedTypes.

Il parametro maximumSize imposta la dimensione massima del file consentita (il valore predefinito è di circa 2 MB). Il parametro allowedTypes è un elenco separato da virgole di tipi di contenuto accettato (MIME) come mostrato di seguito:

<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>

Di seguito è riportato il contenuto di web.xml file -

<?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>

Ora fai clic con il pulsante destro del mouse sul nome del progetto e fai clic Export > WAR Fileper creare un file War. Quindi distribuire questo WAR nella directory webapps di Tomcat. Infine, avvia il server Tomcat e prova ad accedere all'URLhttp://localhost:8080/HelloWorldStruts2/upload.jsp. Questo produrrà la seguente schermata:

Ora seleziona un file "Contacts.txt" utilizzando il pulsante Sfoglia e fai clic sul pulsante di caricamento che caricherà il file sul tuo servizio e dovresti vedere la pagina successiva. Puoi controllare che il file caricato sia stato salvato in C: \ apache-tomcat-6.0.33 \ work.

Si noti che FileUpload Interceptor elimina automaticamente il file caricato, quindi è necessario salvare il file caricato a livello di programmazione in una posizione prima che venga eliminato.

Messaggio di errore

L'intercettatore fileUplaod utilizza diversi tasti di messaggio di errore predefiniti:

Suor n Chiave e descrizione del messaggio di errore
1

struts.messages.error.uploading

Un errore generale che si verifica quando il file non può essere caricato.

2

struts.messages.error.file.too.large

Si verifica quando il file caricato è troppo grande come specificato da maximumSize.

3

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

Si verifica quando il file caricato non corrisponde ai tipi di contenuto previsti specificati.

Puoi sovrascrivere il testo di questi messaggi in WebContent/WEB-INF/classes/messages.properties file di risorse.