Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java Web开发中。在Struts2中,实现文件上传功能是一项常见的需求,例如用户可能需要上传图片、文档或其他类型的文件。本实例主要关注如何在Struts2框架下进行文件上传。
我们需要在Struts2配置文件(通常为struts.xml)中添加一个action配置,用于处理文件上传请求。这个action需要关联一个特定的Action类,该类将接收并处理上传的文件数据。例如:
```xml
<action name="upload" class="com.example.UploadAction">
<interceptor-ref name="fileUpload">
<param name="maximumSize">1048576</param> <!-- 设置允许的最大文件大小 -->
<param name="allowedTypes">image/jpeg,image/png,application/pdf</param> <!-- 设置允许上传的文件类型 -->
</interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/upload.jsp</result>
</action>
```
在上述配置中,`fileUpload`拦截器用于处理文件上传,可以设置最大文件大小和允许的文件类型。
接着,创建对应的Action类(例如:UploadAction.java),并实现`execute`方法。在这个方法中,我们可以访问到上传的文件,并将其保存到服务器的指定位置。例如:
```java
public class UploadAction extends ActionSupport {
private File file; // 用于接收上传的文件
private String fileName; // 文件名
private String contentType; // 文件类型
// getter and setter...
@Override
public String execute() throws Exception {
// 检查文件是否为空,如果为空则返回错误
if (file == null) {
return INPUT;
}
// 获取上传文件的临时路径
String realPath = ServletActionContext.getServletContext().getRealPath("/uploads");
File saveDir = new File(realPath);
if (!saveDir.exists()) {
saveDir.mkdirs();
}
// 将文件移动到目标位置
String serverFileName = UUID.randomUUID().toString() + "_" + fileName; // 为了避免重名,可以使用UUID生成随机文件名
File targetFile = new File(saveDir, serverFileName);
file.renameTo(targetFile);
// 打印上传文件的信息
System.out.println("上传文件名为:" + fileName);
System.out.println("文件类型为:" + contentType);
System.out.println("文件保存路径:" + targetFile.getAbsolutePath());
return SUCCESS;
}
}
```
在HTML页面(如upload.jsp)中,我们需要创建一个表单,使用`enctype="multipart/form-data"`指定表单数据类型为多部分编码,以支持文件上传。然后,使用`<s:file>`标签来创建一个文件输入控件:
```html
<form action="upload" method="post" enctype="multipart/form-data">
<s:file name="file" label="选择文件" />
<input type="submit" value="上传" />
</form>
```
当用户提交表单时,Struts2会调用我们之前定义的UploadAction,处理上传的文件。
以上就是Struts2上传文件的基本流程。在实际应用中,还需要考虑异常处理、文件大小限制、文件类型检查等安全性问题。例如,可以通过自定义拦截器或在Action类中添加额外的验证逻辑来增强安全性。同时,为了提供友好的用户体验,可以在成功或失败后通过页面提示告知用户操作结果。在示例中的"success.jsp"和"input.jsp"页面可以展示这些信息。
项目结构中提到的".classpath"、".mymetadata"、".project"等文件是Eclipse或MyEclipse的项目配置文件,"WebRoot"是Web应用的根目录,"src"包含源代码。在实际部署应用时,这些文件不会包含在最终的WAR或EAR文件中,只有与业务逻辑相关的类、配置文件和资源文件会被打包。