- Struts 2 教程
- Struts2 - 主页
- Struts2 - 基本 MVC 架构
- Struts2 - 概述
- Struts2 - 环境设置
- Struts2 - 架构
- Struts2 - 示例
- Struts2 - 配置
- Struts2 - 动作
- Struts2 - 拦截器
- Struts2 - 结果类型
- Struts2 - 价值堆栈/OGNL
- Struts2 - 文件上传
- Struts2 - 数据库访问
- Struts2 - 发送电子邮件
- Struts2 - 验证
- Struts2 - 本地化
- Struts2 - 类型转换
- Struts2 - 主题/模板
- Struts2 - 异常处理
- Struts2 - 注释
- Struts 2 集成
- Struts2-Spring
- Struts2 - 瓷砖
- Struts2-Hibernate
- Struts 2 有用资源
- Struts2 - 问题与解答
- Struts2 - 快速指南
- Struts2 - 有用的资源
- Struts2 - 讨论
Struts 2 - 文件上传
Struts 2 框架提供了对使用“HTML 中基于表单的文件上传”处理文件上传的内置支持。上传文件时,它通常会存储在临时目录中,并且应由 Action 类对其进行处理或移动到永久目录,以确保数据不会丢失。
注意- 服务器可能有适当的安全策略,禁止您写入临时目录和属于您的 Web 应用程序的目录之外的目录。
Struts 中的文件上传可以通过一个名为FileUpload拦截器的预定义拦截器实现,该拦截器可通过 org.apache.struts2.interceptor.FileUploadInterceptor 类使用,并作为 defaultStack 的一部分包含在内。您仍然可以在 struts.xml 中使用它来设置各种参数,如下所示。
创建视图文件
让我们从创建浏览和上传所选文件所需的视图开始。因此,让我们创建一个带有纯 HTML 上传表单的index.jsp,允许用户上传文件 -
<%@ 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>
创建动作类
接下来,让我们创建一个名为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 拦截器和参数拦截器为我们完成了所有繁重的工作。
默认情况下,FileUpload 拦截器提供三个可用参数。它们按以下模式命名 -
[您的文件名参数] - 这是用户上传的实际文件。在此示例中,它将是“myFile”
[您的文件名参数]ContentType - 这是已上传文件的内容类型。在此示例中,它将是“myFileContentType”
[您的文件名参数]FileName - 这是上传的文件的名称。在此示例中,它将是“myFileFileName”
感谢 Struts 拦截器,我们可以使用这三个参数。我们所要做的就是在我们的 Action 类中创建三个具有正确名称的参数,并且这些变量会自动为我们自动连接。因此,在上面的示例中,我们有三个参数和一个操作方法,如果一切顺利,则仅返回“成功”,否则返回“错误”。
配置文件
以下是控制文件上传过程的 Struts2 配置属性 -
先生编号 | 属性及说明 |
---|---|
1 | struts.multipart.maxSize 接受为文件上传的文件的最大大小(以字节为单位)。默认为 250M。 |
2 | struts.multipart.parser 用于上传多部分表单的库。默认是雅加达 |
3 | 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拦截器是默认拦截器堆栈的一部分,因此我们不需要显式配置它。但是,您可以在 <action> 内添加 <interceptor-ref> 标记。fileUpload 拦截器采用两个参数 (a) MaximumSize和(b) allowedTypes。
MaximumSize 参数设置允许的最大文件大小(默认值约为 2MB)。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>
现在右键单击项目名称,然后单击“导出”>“WAR 文件”以创建一个 War 文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动 Tomcat 服务器并尝试访问 URL http://localhost:8080/HelloWorldStruts2/upload.jsp。这将产生以下屏幕 -
现在,使用浏览按钮选择文件“Contacts.txt”,然后单击上传按钮,该按钮会将文件上传到您的服务器上,您应该会看到下一页。您可以检查上传的文件应保存在 C:\apache-tomcat-6.0.33\work 中。
请注意,文件上传拦截器会自动删除上传的文件,因此您必须在删除上传的文件之前以编程方式将其保存在某个位置。
错误信息
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资源文件中覆盖这些消息的文本。