Struts 2 - загрузка файлов

Фреймворк Struts 2 обеспечивает встроенную поддержку обработки загрузки файлов с помощью «загрузки файлов на основе форм в HTML». Когда файл загружается, он обычно сохраняется во временном каталоге, и они должны быть обработаны или перемещены вашим классом Action в постоянный каталог, чтобы гарантировать, что данные не будут потеряны.

Note - На серверах может быть установлена ​​политика безопасности, запрещающая вам запись в каталоги, отличные от временного каталога и каталогов, принадлежащих вашему веб-приложению.

Загрузка файлов в Struts возможна через предопределенный перехватчик, называемый FileUpload перехватчик, который доступен через класс org.apache.struts2.interceptor.FileUploadInterceptor и включен как частьdefaultStack. Тем не менее, вы можете использовать это в своем файле struts.xml для установки различных параметров, как мы увидим ниже.

Создать файлы просмотра

Давайте начнем с создания нашего представления, которое потребуется для просмотра и загрузки выбранного файла. Итак, давайте создадимindex.jsp с простой формой загрузки HTML, которая позволяет пользователю загружать файл -

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

В приведенном выше примере стоит отметить несколько моментов. Во-первых, enctype формы устанавливается наmultipart/form-data. Это должно быть установлено так, чтобы загрузка файлов успешно обрабатывалась перехватчиком загрузки файлов. Следующее, что следует отметить, - это метод действия формы.upload и имя поля загрузки файла - myFile. Эта информация нужна нам для создания метода действия и конфигурации struts.

Затем давайте создадим простой файл jsp success.jsp чтобы отобразить результат загрузки нашего файла в случае успеха.

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

Ниже будет файл результатов error.jsp в случае ошибки при загрузке файла -

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

Создать класс действия

Затем давайте создадим класс Java с именем uploadFile.java который позаботится о загрузке файла и хранении этого файла в безопасном месте -

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

В uploadFile.javaэто очень простой класс. Важно отметить, что перехватчик FileUpload вместе с перехватчиком параметров выполняет всю тяжелую работу за нас.

Перехватчик FileUpload по умолчанию предоставляет вам три параметра. Они названы по следующему шаблону -

  • [your file name parameter] - Это фактический файл, загруженный пользователем. В этом примере это будет «myFile».

  • [your file name parameter]ContentType- Это тип содержимого загруженного файла. В этом примере это будет myFileContentType.

  • [your file name parameter]FileName- Это имя загруженного файла. В этом примере это будет «myFileFileName»

Эти три параметра доступны нам благодаря Struts Interceptors. Все, что нам нужно сделать, это создать три параметра с правильными именами в нашем классе Action, и автоматически эти переменные будут автоматически подключены для нас. Итак, в приведенном выше примере у нас есть три параметра и метод действия, который просто возвращает «успех», если все идет нормально, в противном случае возвращает «ошибку».

Файлы конфигурации

Ниже приведены свойства конфигурации Struts2, которые управляют процессом загрузки файлов.

Старший Нет Свойства и описание
1

struts.multipart.maxSize

Максимальный размер (в байтах) файла, принимаемого в качестве загружаемого файла. По умолчанию 250 МБ.

2

struts.multipart.parser

Библиотека, используемая для загрузки составной формы. По умолчаниюjakarta

3

struts.multipart.saveDir

Место для хранения временного файла. По умолчанию - javax.servlet.context.tempdir.

Чтобы изменить любой из этих параметров, вы можете использовать constant в файле struts.xml ваших приложений, как это сделал я, чтобы изменить максимальный размер загружаемого файла.

Дайте нам struts.xml следующим образом -

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

Поскольку, FileUploadперехватчик является частью стека перехватчиков по умолчанию, нам не нужно настраивать его явность. Но вы можете добавить тег <interceptor-ref> внутри <action>. Перехватчик fileUpload принимает два параметра(a) maximumSize и (b) allowedTypes.

Параметр maximumSize устанавливает максимально допустимый размер файла (по умолчанию примерно 2 МБ). Параметр allowedTypes представляет собой список типов разрешенного содержимого (MIME), разделенных запятыми, как показано ниже:

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

Ниже приводится содержание web.xml файл -

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

Теперь щелкните правой кнопкой мыши имя проекта и щелкните Export > WAR Fileдля создания файла War. Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресуhttp://localhost:8080/HelloWorldStruts2/upload.jsp. Это создаст следующий экран -

Теперь выберите файл «Contacts.txt», используя кнопку «Обзор», и нажмите кнопку «Загрузить», которая загрузит файл на вашу службу, и вы должны увидеть следующую страницу. Вы можете проверить, что загруженный файл должен быть сохранен в C: \ apache-tomcat-6.0.33 \ work.

Обратите внимание, что FileUpload Interceptor автоматически удаляет загруженный файл, поэтому вам придется программно сохранить загруженный файл в каком-либо месте, прежде чем он будет удален.

Сообщения об ошибках

Перехватчик fileUplaod использует несколько ключей сообщений об ошибках по умолчанию -

Старший Нет Ключ сообщения об ошибке и описание
1

struts.messages.error.uploading

Общая ошибка, возникающая, когда файл не может быть загружен.

2

struts.messages.error.file.too.large

Происходит, когда загруженный файл слишком велик, как указано в maximumSize.

3

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

Происходит, когда загруженный файл не соответствует указанным ожидаемым типам содержимого.

Вы можете изменить текст этих сообщений в WebContent/WEB-INF/classes/messages.properties файлы ресурсов.