📅  最后修改于: 2020-11-11 04:59:24             🧑  作者: Mango
Struts 2框架提供内置支持,可使用“ HTML中基于表单的文件上载”来处理文件上载。上传文件后,通常会将其存储在一个临时目录中,并且Action类应将其处理或移动到永久目录中,以确保数据不会丢失。
注–服务器可能具有适当的安全策略,该策略禁止您写入除临时目录和属于Web应用程序的目录以外的目录。
通过预定义的拦截器FileUpload拦截器可以在Struts中上传文件,该拦截器可通过org.apache.struts2.interceptor.FileUploadInterceptor类获得,并作为defaultStack的一部分包含在内。仍然可以在struts.xml中使用它来设置各种参数,如下所示。
让我们从创建我们的视图开始,这是浏览和上传选定文件所必需的。因此,让我们创建具有纯HTML上传格式的index.jsp ,该格式允许用户上传文件-
File Upload
在上面的示例中有几点值得注意。首先,将表单的enctype设置为multipart / form-data 。应该进行设置,以便文件上传拦截器成功处理文件上传。接下来要注意的是表单的操作方法上载以及文件上载字段的名称,即myFile 。我们需要此信息来创建操作方法和struts配置。
接下来,让我们创建一个简单的jsp文件success.jsp,以显示文件上传成功的结果。
File Upload Success
You have successfully uploaded
如果上传文件时出现一些错误,下面将是结果文件error.jsp-
File Upload Error
There has been an error in uploading the file.
接下来,让我们创建一个名为uploadFile.java的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拦截器与Parameters Interceptor一起为我们完成了所有繁重的工作。
默认情况下,FileUpload拦截器使三个参数可用。它们以以下模式命名-
[您的文件名参数] -这是用户已上传的实际文件。在此示例中,它将是“ myFile”
[您的文件名参数] ContentType-这是上载文件的内容类型。在此示例中,它将是“ myFileContentType”
[您的文件名参数] FileName-这是上载的文件名。在此示例中,它将是“ myFileFileName”
感谢Struts拦截器,这三个参数对我们可用。我们要做的就是在Action类中使用正确的名称创建三个参数,然后自动为我们自动连接这些变量。因此,在上面的示例中,我们有三个参数和一个操作方法,如果一切正常,则该方法简单地返回“成功”,否则返回“错误”。
以下是控制文件上传过程的Struts2配置属性-
Sr.No | Properties & Description |
---|---|
1 |
struts.multipart.maxSize The maximum size (in bytes) of a file to be accepted as a file upload. Default is 250M. |
2 |
struts.multipart.parser The library used to upload the multipart form. By default is jakarta |
3 |
struts.multipart.saveDir The location to store the temporary file. By default is javax.servlet.context.tempdir. |
为了更改这些设置中的任何一个,您可以在应用程序的struts.xml文件中使用常量标记,就像我更改要上传的文件的最大大小一样。
让我们有如下的struts.xml-
/success.jsp
/error.jsp
由于FileUpload拦截器是默认拦截器堆栈的一部分,因此我们无需显式配置它。但是,您可以在
maximumSize参数设置允许的最大文件大小(默认值约为2MB)。 allowedTypes参数是用逗号分隔的接受内容(MIME)类型的列表,如下所示-
image/jpeg,image/gif
/success.jsp
/error.jsp
以下是web.xml文件的内容-
Struts 2
index.jsp
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
现在,右键单击项目名称,然后单击导出> WAR文件以创建War文件。然后,将此WAR部署在Tomcat的webapps目录中。最后,启动Tomcat服务器并尝试访问URL http:// localhost:8080 / HelloWorldStruts2 / upload.jsp 。这将产生以下屏幕-
现在,使用“浏览”按钮选择一个文件“ Contacts.txt”,然后单击“上传”按钮,这会将文件上传到您的服务中,您应该会看到下一页。您可以检查上传的文件应保存在C:\ apache-tomcat-6.0.33 \ work中。
请注意,FileUpload Interceptor会自动删除上传的文件,因此您必须以编程方式将上传的文件保存在某个位置,然后再将其删除。
fileUplaod拦截器使用多个默认错误消息密钥-
Sr.No | Error Message Key & Description |
---|---|
1 |
struts.messages.error.uploading A general error that occurs when the file could not be uploaded. |
2 |
struts.messages.error.file.too.large Occurs when the uploaded file is too large as specified by maximumSize. |
3 |
struts.messages.error.content.type.not.allowed Occurs when the uploaded file does not match the expected content types specified. |
您可以在WebContent / WEB-INF / classes / messages.properties资源文件中覆盖这些消息的文本。