📅  最后修改于: 2023-12-03 14:47:44.359000             🧑  作者: Mango
本文介绍如何在 Struts 2 中实现文件上传功能。文件上传是一个常见的需求,例如用户可以上传头像、图片、文档等。Struts 2 提供了一个文件上传插件(File Upload Interceptor),可以方便地处理文件上传操作。
本示例假设已经有一个基础的 Struts 2 程序,能够接收请求并返回响应。如果你还不熟悉 Struts 2,可以先参考 Struts 2 入门示例。
以下是实现文件上传的步骤:
在 pom.xml
中添加以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.26</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
这里使用了 Struts 2、commons-fileupload 和 commons-io 三个依赖。其中,commons-fileupload 是 Apache 的一个开源上传组件,可以方便地解析表单和文件上传数据;commons-io 则是 Apache 的一个开源 I/O 组件,提供了一些常见的 I/O 操作。
在 struts.xml
中添加以下配置:
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest"/>
<constant name="struts.multipart.parser" value="jakarta"/>
这里配置了 Struts 2 使用 JakartaMultiPartRequest 处理文件上传请求。当然,还有其他的处理器可以选择,例如 CommonMultiPartRequest。
在 Struts 2 中,Action 是处理请求的基本单位,我们需要添加一个处理文件上传操作的 Action。在本示例中,我们将上传的文件保存到磁盘上,并输出上传成功的消息。
package com.example;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import java.io.File;
import java.io.IOException;
public class FileUploadAction extends ActionSupport {
private File file;
private String fileFileName;
private String fileContentType;
public String execute() throws IOException {
String filePath = ServletActionContext.getServletContext().getRealPath("/"); // 获取项目根目录
File uploadFile = new File(filePath, fileFileName); // 构造上传文件对象
FileUtils.copyFile(file, uploadFile); // 保存上传文件
addActionMessage("文件上传成功!"); // 输出成功消息
return SUCCESS;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
}
在这个 Action 中,我们定义了三个属性:file、fileFileName 和 fileContentType。其中,file 是上传的文件本身,fileFileName 是上传的文件名,fileContentType 是上传的文件类型。这些属性的值是由 Struts 2 框架自动设置的,我们只需要提供 getter/setter 方法即可。
在 execute() 方法中,我们获取了上传文件的保存路径(即项目根目录),并构造了上传文件对象。然后,使用 FileUtils.copyFile() 方法将上传文件保存到磁盘上。最后,使用 addActionMessage() 方法输出成功消息,返回 SUCCESS 状态码。
在 JSP 文件中添加以下表单:
<form action="fileUploadAction" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
这个表单中,我们使用了 enctype="multipart/form-data" 属性,指定了表单的数据类型为多部分。这样,浏览器就会按照相关规范将表单数据和上传文件打包成一条请求发送到服务器。
其中,name="file" 指定了上传文件的参数名,这个名称必须和 Action 类中的文件属性名称一致。
完整代码请参考 https://github.com/lambdasnow/struts2-file-upload-example。可以使用以下命令在本地运行示例:
git clone https://github.com/lambdasnow/struts2-file-upload-example.git
cd struts2-file-upload-example
mvn jetty:run
然后,访问 http://localhost:8080
即可看到文件上传示例页面。