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 файлы ресурсов.