Struts 2 - Datei-Uploads

Das Struts 2-Framework bietet integrierte Unterstützung für die Verarbeitung des Hochladens von Dateien mithilfe von "Formularbasiertes Hochladen von Dateien in HTML". Wenn eine Datei hochgeladen wird, wird sie normalerweise in einem temporären Verzeichnis gespeichert und sollte von Ihrer Action-Klasse verarbeitet oder in ein permanentes Verzeichnis verschoben werden, um sicherzustellen, dass die Daten nicht verloren gehen.

Note - Auf Servern ist möglicherweise eine Sicherheitsrichtlinie vorhanden, die es Ihnen verbietet, in andere Verzeichnisse als das temporäre Verzeichnis und die Verzeichnisse zu schreiben, die zu Ihrer Webanwendung gehören.

Das Hochladen von Dateien in Struts ist über einen vordefinierten Interceptor möglich FileUpload Interceptor, der über die Klasse org.apache.struts2.interceptor.FileUploadInterceptor verfügbar ist und als Teil der Klasse enthalten istdefaultStack. Trotzdem können Sie dies in Ihrer struts.xml verwenden, um verschiedene Parameter festzulegen, wie wir unten sehen werden.

Ansichtsdateien erstellen

Beginnen wir mit der Erstellung unserer Ansicht, die zum Durchsuchen und Hochladen einer ausgewählten Datei erforderlich ist. Also lasst uns eine erstellenindex.jsp mit einem einfachen HTML-Upload-Formular, mit dem der Benutzer eine Datei hochladen kann -

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

Im obigen Beispiel sind einige Punkte zu beachten. Zunächst wird der Enctype des Formulars auf gesetztmultipart/form-data. Dies sollte so eingestellt sein, dass Datei-Uploads vom Datei-Upload-Interceptor erfolgreich verarbeitet werden. Der nächste Punkt ist die Aktionsmethode des Formularsupload und der Name des Datei-Upload-Feldes - das ist myFile. Wir benötigen diese Informationen, um die Aktionsmethode und die Strebenkonfiguration zu erstellen.

Als nächstes erstellen wir eine einfache JSP-Datei success.jsp um das Ergebnis unseres Datei-Uploads anzuzeigen, falls es erfolgreich wird.

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

Es folgt die Ergebnisdatei error.jsp falls beim Hochladen der Datei ein Fehler auftritt -

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

Aktionsklasse erstellen

Als nächstes erstellen wir eine Java-Klasse namens uploadFile.java die sich um das Hochladen der Datei und das Speichern dieser Datei an einem sicheren Ort kümmert -

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

Das uploadFile.javaist eine sehr einfache Klasse. Das Wichtigste ist, dass der FileUpload-Interceptor zusammen mit dem Parameters Interceptor das ganze schwere Heben für uns erledigt.

Der FileUpload-Interceptor stellt Ihnen standardmäßig drei Parameter zur Verfügung. Sie werden im folgenden Muster benannt -

  • [your file name parameter] - Dies ist die tatsächliche Datei, die der Benutzer hochgeladen hat. In diesem Beispiel ist es "myFile".

  • [your file name parameter]ContentType- Dies ist der Inhaltstyp der Datei, die hochgeladen wurde. In diesem Beispiel ist es "myFileContentType".

  • [your file name parameter]FileName- Dies ist der Name der Datei, die hochgeladen wurde. In diesem Beispiel ist es "myFileFileName".

Die drei Parameter stehen uns dank der Struts Interceptors zur Verfügung. Wir müssen lediglich drei Parameter mit den richtigen Namen in unserer Action-Klasse erstellen und diese Variablen werden automatisch für uns automatisch verkabelt. Im obigen Beispiel haben wir drei Parameter und eine Aktionsmethode, die einfach "Erfolg" zurückgibt, wenn alles gut geht, andernfalls "Fehler" zurückgibt.

Konfigurationsdateien

Im Folgenden sind die Struts2-Konfigurationseigenschaften aufgeführt, die den Prozess des Hochladens von Dateien steuern:

Sr.Nr. Eigenschaften & Beschreibung
1

struts.multipart.maxSize

Die maximale Größe (in Byte) einer Datei, die als Datei-Upload akzeptiert werden soll. Standard ist 250M.

2

struts.multipart.parser

Die Bibliothek, die zum Hochladen des mehrteiligen Formulars verwendet wurde. Standardmäßig istjakarta

3

struts.multipart.saveDir

Der Speicherort für die temporäre Datei. Standardmäßig ist javax.servlet.context.tempdir.

Um eine dieser Einstellungen zu ändern, können Sie verwenden constant Tag in Ihrer Anwendung struts.xml-Datei, wie ich es getan habe, um die maximale Größe einer hochzuladenden Datei zu ändern.

Lassen Sie uns unsere haben struts.xml wie folgt -

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

Schon seit, FileUploadInterceptor ist ein Teil des Standardstapels von Interceptors. Wir müssen ihn nicht explizit konfigurieren. Sie können jedoch das <interceptor-ref> -Tag in <action> hinzufügen. Der fileUpload-Interceptor akzeptiert zwei Parameter(a) maximumSize und (b) allowedTypes.

Der Parameter maximumSize legt die maximal zulässige Dateigröße fest (der Standardwert beträgt ca. 2 MB). Der Parameter allowTypes ist eine durch Kommas getrennte Liste akzeptierter Inhaltstypen (MIME) (siehe unten).

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

Es folgt der Inhalt von web.xml Datei -

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

Klicken Sie nun mit der rechten Maustaste auf den Projektnamen und klicken Sie auf Export > WAR Fileum eine War-Datei zu erstellen. Stellen Sie diese WAR dann im Webanwendungsverzeichnis von Tomcat bereit. Starten Sie abschließend den Tomcat-Server und versuchen Sie, auf die URL zuzugreifenhttp://localhost:8080/HelloWorldStruts2/upload.jsp. Daraufhin wird der folgende Bildschirm angezeigt:

Wählen Sie nun eine Datei "Contacts.txt" mit der Schaltfläche "Durchsuchen" aus und klicken Sie auf die Schaltfläche "Hochladen", um die Datei auf Ihren Aufschlag hochzuladen. Die nächste Seite sollte angezeigt werden. Sie können überprüfen, ob die hochgeladene Datei in C: \ apache-tomcat-6.0.33 \ work gespeichert werden soll.

Beachten Sie, dass der FileUpload Interceptor die hochgeladene Datei automatisch löscht, sodass Sie die hochgeladene Datei programmgesteuert an einem bestimmten Ort speichern müssen, bevor sie gelöscht wird.

Fehlermeldungen

Der fileUplaod-Interceptor verwendet mehrere Standardfehlermeldeschlüssel -

Sr.Nr. Fehlermeldung Schlüssel & Beschreibung
1

struts.messages.error.uploading

Ein allgemeiner Fehler, der auftritt, wenn die Datei nicht hochgeladen werden konnte.

2

struts.messages.error.file.too.large

Tritt auf, wenn die hochgeladene Datei zu groß ist, wie von maximumSize angegeben.

3

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

Tritt auf, wenn die hochgeladene Datei nicht mit den angegebenen erwarteten Inhaltstypen übereinstimmt.

Sie können den Text dieser Nachrichten in überschreiben WebContent/WEB-INF/classes/messages.properties Ressourcendateien.