Инфраструктура Struts 2 обеспечивает встроенную поддержку обработки загрузки файлов с помощью «Загрузка файлов на основе форм в HTML». Когда файл загружен, он, как правило, сохраняется во временном каталоге, и ваш класс Action должен обрабатывать или перемещать его в постоянный каталог, чтобы гарантировать, что данные не будут потеряны.
Примечание. На серверах может быть установлена политика безопасности, запрещающая запись в каталоги, отличные от временного каталога и каталогов, принадлежащих вашему веб-приложению.
Загрузка файлов в 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 . Это должно быть установлено так, чтобы пересылка файлов успешно выполнялась закачкой файлов. Следующее, что нужно отметить, — это метод действия формы загрузки и имя поля загрузки файла — myFile . Нам нужна эта информация для создания метода действия и конфигурации распорок.
Далее, давайте создадим простой 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 делает три параметра доступными для вас по умолчанию. Они названы в следующем порядке —
-
[ваш параметр имени файла] — это фактический файл, который пользователь загрузил. В этом примере это будет «myFile»
-
[параметр имени вашего файла] ContentType — это тип содержимого файла, который был загружен. В этом примере это будет «myFileContentType»
-
[параметр имени вашего файла] FileName — это имя файла, который был загружен. В этом примере это будет «myFileFileName»
[ваш параметр имени файла] — это фактический файл, который пользователь загрузил. В этом примере это будет «myFile»
[параметр имени вашего файла] ContentType — это тип содержимого файла, который был загружен. В этом примере это будет «myFileContentType»
[параметр имени вашего файла] FileName — это имя файла, который был загружен. В этом примере это будет «myFileFileName»
Три параметра доступны для нас, благодаря перехватчикам Struts. Все, что нам нужно сделать, — это создать три параметра с правильными именами в нашем классе Action, и автоматически эти переменные будут автоматически подключены для нас. Итак, в приведенном выше примере у нас есть три параметра и метод действия, который просто возвращает «success», если все идет хорошо, в противном случае он возвращает «error».
Конфигурационные файлы
Ниже приведены свойства конфигурации Struts2, которые управляют процессом загрузки файлов.
Sr.No | Свойства и описание |
---|---|
1 |
struts.multipart.maxSize Максимальный размер (в байтах) файла, который будет принят как загрузка файла. По умолчанию 250M. |
2 |
struts.multipart.parser Библиотека, используемая для загрузки многочастной формы. По умолчанию это Джакарта |
3 |
struts.multipart.saveDir Расположение для хранения временного файла. По умолчанию это javax.servlet.context.tempdir. |
struts.multipart.maxSize
Максимальный размер (в байтах) файла, который будет принят как загрузка файла. По умолчанию 250M.
struts.multipart.parser
Библиотека, используемая для загрузки многочастной формы. По умолчанию это Джакарта
struts.multipart.saveDir
Расположение для хранения временного файла. По умолчанию это javax.servlet.context.tempdir.
Чтобы изменить любой из этих параметров, вы можете использовать постоянный тег в файле 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) allowTypes .
Параметр MaximumSize устанавливает максимально допустимый размер файла (по умолчанию приблизительно 2 МБ). Параметр allowTypes представляет собой список допустимых типов содержимого (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>
Теперь щелкните правой кнопкой мыши на имени проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / upload.jsp . Это создаст следующий экран —
Теперь выберите файл «Contacts.txt» с помощью кнопки «Обзор» и нажмите кнопку «Загрузить», после чего файл будет загружен на ваш сервер, и вы должны увидеть следующую страницу. Вы можете проверить, что загруженный файл должен быть сохранен в C: \ apache-tomcat-6.0.33 \ work.
Обратите внимание, что FileUpload Interceptor автоматически удаляет загруженный файл, поэтому вам придется программно сохранить загруженный файл в каком-то месте, прежде чем он будет удален.
Сообщения об ошибках
Перехватчик fileUplaod использует несколько ключей сообщений об ошибках по умолчанию —
Sr.No | Ключ сообщения об ошибке и описание |
---|---|
1 |
struts.messages.error.uploading Общая ошибка, которая возникает, когда файл не может быть загружен. |
2 |
struts.messages.error.file.too.large Происходит, когда загружаемый файл слишком велик, как указано в MaximumSize. |
3 |
struts.messages.error.content.type.not.allowed Происходит, когда загруженный файл не соответствует ожидаемым указанным типам содержимого. |
struts.messages.error.uploading
Общая ошибка, которая возникает, когда файл не может быть загружен.
struts.messages.error.file.too.large
Происходит, когда загружаемый файл слишком велик, как указано в MaximumSize.
struts.messages.error.content.type.not.allowed
Происходит, когда загруженный файл не соответствует ожидаемым указанным типам содержимого.
Вы можете переопределить текст этих сообщений в файлах ресурсов WebContent / WEB-INF / classes / messages.properties .